2010-05-17 68 views
6

我一直在玩Xcode中的iPad SplitView模板。這裏有兩個是自動生成的由基於視圖的拆分應用程序模板爲您的許多重要方法...爲什麼我的應用程序委託的didFinishLaunchingWithOptions方法突然被稱爲AFTER我的RootViewController:viewDidLoad方法?

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

#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(); 
    } 
} 

如果在完成任何更改之前構建並運行項目,則在調用之前調用application:didFinishLaunchingWithOptions方法方法被調用。我是iPhone新手,但我認爲這是正確和典型的順序。因此,這裏是我所做的更改...

  • 一旦我證實了一切工作沒有任何修改,我改變了RootViewController的代碼,並將其設置爲UIViewController(而不是UITableViewController默認情況下)子類,並提出相應的在Interface Builder中進行調整。我建立並運行,一切仍然正常工作。
  • 然後,我在IB的RootView中添加了一個UIView(沒有任何內容),當我建立並運行它時,突然RootViewController:viewDidLoadapplication:didFinishLaunchingWithOptions方法之前被調用。

我需要得到它回到它是因爲之前工作的方式,你可以在代碼中看到,viewDidLoad方法取決於didFinishLauchingWithOptions方法來執行,因此它可以設置RootViewController的的managedObjectContext,它用來執行取回請求。

  1. 任何想法是什麼造成了這種情況?
  2. 任何想法如何解決這個問題?

非常感謝您的幫助!我會繼續研究和玩代碼。

回答

4

在模板應用-applicationDidFinishLaunching增加RootViewController的的視圖窗口,使所述視圖加載,所以顯然-viewDidLoad將遵循 - applicationDidFinishLaunching。

ViewDidLoad是從applicationDidFinishLaunching(間接)調用的。

如您所說,如果在applicationDidFinishLaunching之前調用viewDidLoad,那是因爲您在調用applicationDidFinishLaunching之前完成了一些操作以使視圖加載。

您是否在-viewDidLoad中添加了一個斷點並查看堆棧跟蹤以查看負責調用它的內容?

2

你在哪裏初始化RootViewController?通常,您在applicationDidFinishLaunching(至少在iPhone上)這樣做。如果你在你的應用程序委託的init方法對其進行初始化,這可能引起調用根視圖控制器的viewDidLoad方法之前applicationDidFinishLaunching.

+0

謝謝,eman!基於SplitView的應用程序模板不會爲RootViewController生成任何初始化代碼,至少我沒有在任何地方看到它。所以,由於我是新開發的iPad,並且基於自學到目前爲止,我將假設RootViewController的初始化邏輯嵌入在主窗口的nib文件中,因爲大部分UI都是在IB,對嗎? – BeachRunnerFred 2010-05-18 03:49:38

2

這是由於在MainWindow.xib中,您的應用程序委託對象未連接到文件的所有者(UIApplication)而導致的可推測性。您可以打開MainWindow.xib並右鍵單擊您的App Delegate,查看它是否在引用出口到文件的所有者中具有連接。如果不是,請將其設置爲。這將解決您的問題。

相關問題