2

Çözünürlük: Bu hatayı Apple'a göndermek üzere yeni bir projede yeniden oluşturmaya çalışırken, bunun iPhone OS 2.1'e özgü olduğunu ve 2.2 düzeltmeleri derlediğini keşfettim. sorun. Stephen, yardımın için teşekkürler. Cevabınızı hala kabul edersem işe yarayacak ya da 2.2 için derleme yapmaya istekli olmadığım için cevabınızı kabul ediyorum.viewDidAppear: başlangıçta sunulan modal görünüm denetleyicisine iki kez çağrıldı


ben kökten kodda yeni tarzı olanlara eski tarz kayıtları dönüştürmek için beni gerektiren bir şekilde onun veritabanı şemasını değişiyor bir uygulama var. Kullanıcılar bu uygulamada çok fazla veri depolayabileceğinden, verileri (örneğin kullanıcının gördüğü ilk şey) üzerine yüklerken bir ilerleme çubuğu olan bir modal görüntü denetleyicisi görüntülemeye çalışıyorum. Bu denetleyicinin viewDidAppear: bir veritabanı işlemini başlatır ve sonra gerçek bir bağlantı iş parçacığı yapmak için bir arka plan iş parçacığı başlatır, bu bazen ilerleme çubuğunu güncelleştirmek için ön plan iş parçacığı bildirmek için performSelectorInMainThread:withObject:waitUntilDone: kullanır.

Sorun şu ki, viewDidAppear: iki kez çağrılıyor. Bunu fark ettim çünkü "bir işlem başlat" adımı bir "veritabanı meşgul" mesajıyla başarısız oluyor, ancak bir kesme noktası belirlemek gerçekten iki kez - bir kez -[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:] ve yine -[UIViewController modalPresentTransitionDidComplete] tarafından çağrılıyor. Bu isimler özel UIViewController yöntemleri gibi görünüyor, bu yüzden bu bir çerçeve hatası mı, yoksa UIKit'in yapmamı beklemediği bir şey yapıyorum.

İki İlgili kod alıntılar (bazı alakasız kod özetlenmiştir):

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    (register some default settings in NSUserDefaults) 

    // doing this early because trying to present a modal view controller 
    // before the view controller is visible seems to break it 
    [window addSubview:[self.navigationController view]]; 

    // this is the method that may present the modal view 
    [self.databaseController loadDatabaseWithViewController:self.navigationController]; 

    if(!self.databaseController.willUpgrade) { 
     [self restoreNavigationControllerState]; 
    } 
} 

Ve DatabaseController sınıfından

: Yani

- (void)loadDatabaseWithViewController:(UIViewController*)viewController { 
    (open the new database) 

    (compute the path the old database would live at if it existed) 

    if([[NSFileManager defaultManager] fileExistsAtPath:oldDBPath]) { 
     (open the old database) 

     [viewController presentModalViewController:self animated:NO]; 
    } 
} 

, ben burada vidalama ettiğim bir şey var, ya Apple ile bir hata raporu yazmalı mıyım?

cevap

3

Bunu uygulamada da gördüm. Ben tamamen doğruladı asla, ama bu ne oluyor olduğunu düşünüyorum:

  1. Yük kök görünümü
  2. Yük modal görünümü
  3. OS görünümü
  4. 1. adımda görünümü için bildirim ortaya çıktı gönderir bu durumda başarı DatabaseController sınıf olur akımı görünümü kontrolörü, yukarı alır
  5. OS görünümü modal görünümü için bildirim ortaya çıktı gönderir
  6. T o mevcut görüş kontrolörü bildirimi alır. Bu durumda sadece viewDidAppear: ilk çağrı yaşananlar reset Benim durumumda son kez

tamamen aynı kontrolör var.

Sizin durumunuzda iki seçenek akla ilkbahar: yükseltmeyi başlatıp başlatmayacağınızı izlemek için bir statik değişken; veya başlamadan önce iletilen UIView* parametresine bakın.

+0

Yukarıda belirttiğim gibi, sonunda OS 2.2'de düzeltildiğini keşfettim, ancak öneriniz için teşekkürler. –

+0

Sorun değil. "Gerçek" cevabı görmek harika! –