2010-05-17 11 views
6

Xcode'ta iPad'in SplitView şablonuyla oynuyordum. İşteNeden benim app delegate didFinishLaunchingWithOptions yöntemi tüm aniden AFTER benim RootViewController: viewDidLoad yöntemi denir?

AppNameAppDelegate.m

#pragma mark - 
#pragma mark Application lifecycle 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    // Override point for customization after app launch  
    rootViewController.managedObjectContext = self.managedObjectContext; 


    // Add the split view controller's view to the window and display. 
    [window addSubview:splitViewController.view]; 
    [window makeKeyAndVisible]; 

    return YES; 
} 

RootViewController.m ... otomatik oluşturulan bölünmüş görünüm tabanlı uygulama şablonu tarafından sizin için çok önemli yöntemlerden ikisidir

#pragma mark - 
#pragma mark View lifecycle 

- (void)viewDidLoad { 

    [super viewDidLoad]; 
    self.clearsSelectionOnViewWillAppear = NO; 
    self.contentSizeForViewInPopover = CGSizeMake(320.0, 600.0); 

    NSError *error = nil; 
    if (![[self fetchedResultsController] performFetch:&error]) { 

     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 
} 

Herhangi bir değişiklik yapmadan önce projeyi oluşturup çalıştırdığınızda, yöntemi'dan önce çağrılıryöntemi denir. IPhone geliştirme konusunda yeniyim, ama bunun doğru ve tipik bir sıralama olduğunu varsayarak düşünüyorum. Yani burada yaptığım değişiklikler ... Her şeyi herhangi bir değişiklik yapmadan çalışıyordu doğrulaması ardından

  • , ben RootViewController kodu değişti ve UIViewController (yerine varsayılan olarak UITableViewController) bir alt sınıf olarak ayarlayın ve ilgili yapılmış Interface Builder'da ayarlamalar. İnşa ettim ve koştum, her şey hala iyi çalışıyordu.
  • Daha sonra, IB'de RootView'a bir UIView ekledim ve bunu oluşturup çalıştırdığım zaman, RootViewController:viewDidLoad aniden application:didFinishLaunchingWithOptions yönteminden çağrılıyor.

seni kodda görebileceğiniz gibi, geri çünkü daha önce çalışma şeklinden bunu almak gerekir, viewDidLoad yöntemi yüzden ayarlayabilirsiniz yürütmek didFinishLauchingWithOptions yöntemine bağlıdır rootViewController en managedObjectContext bunu gerçekleştirmek için kullandığı getirme isteği.

  1. Buna neden olan herhangi bir fikir var mı?
  2. Bunu nasıl düzeltebilirim?

Yardımlarınız için şimdiden çok teşekkürler! Araştırma yapmaya ve kodla oynamaya devam edeceğim.

cevap

4

görünümü yüklemeye neden pencereye RootViewController görüşünü ekler önce böylece kök görünümü kontrolörün viewDidLoad yöntem çağrıldığında neden olabilir Açıkçası -viewDidLoad takip edecek - applicationDidFinishLaunching.

ViewDidLoad (dolaylı olarak) applicationDidFinishLaunching'den çağrılır.

Gördüğünüz gibi, applicationDidFinishLaunching'den önce viewDidLoad çağrılıyorsa, bunun nedeni applicationDidFinishLaunching çağrılmadan önce görünümün yüklenmesine neden olacak bir şey yapmış olmanızdır.

-viewDidLoad'da bir kesme noktası eklediniz ve onu aramaktan sorumlu olanı görmek için stacktrace'e baktınız mı?

2

RootViewController'u nereden başlatıyorsunuz? Genellikle, applicationDidFinishLaunching'da (en azından iPhone'da) bunu yaparsınız. Eğer uygulama temsilcinizin init yönteminde başlatılıyor ise şablon uygulama -applicationDidFinishLaunching olarak applicationDidFinishLaunching.

+0

Teşekkürler, eman! SplitView tabanlı uygulama şablonu, RootViewController için herhangi bir başlatma kodu üretmiyor, en azından ben hiç bir yerde göremiyorum. Bu yüzden iPad geliştirmeye yeni başladığımdan ve kendime bu noktaya kadar öğrettiğimden beri, UI'nin çoğunun yaratılmasından beri RootViewController'ın ana pencerenin nib dosyasına gömülmesi için başlatma mantığını üstleneceğim. IB, doğru mu? – BeachRunnerFred

2

Bu, MainWindow.xib dosyasında, uygulama temsilcisi nesnesinin File Sahibine (UIApplication) bağlı olmaması nedeniyle oluşan propabaliye neden olur. MainWindow.xib dosyasını açabilir ve Başvuru Çıkışı'nda Dosya Sahibine Bağlantısının olup olmadığını görmek için Uygulama Temsilcinize sağ tıklayabilirsiniz. Değilse, ayarlayın. Ve bu senin problemini çözecek.

İlgili konular