为什么我的应用程序委托的didFinishLaunchingWithOptions方法突然被称为AFTER我的RootViewController:viewDidLoad方法?

问题描述:

我一直在玩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. 任何想法如何解决这个问题?

非常感谢您的帮助!我会继续研究和玩代码。

在模板应用-applicationDidFinishLaunching增加RootViewController的的视图窗口,使所述视图加载,所以显然-viewDidLoad将遵循 - applicationDidFinishLaunching。

ViewDidLoad是从applicationDidFinishLaunching(间接)调用的。

如您所说,如果在applicationDidFinishLaunching之前调用viewDidLoad,那是因为您在调用applicationDidFinishLaunching之前完成了一些操作以使视图加载。

您是否在-viewDidLoad中添加了一个断点并查看堆栈跟踪以查看负责调用它的内容?

你在哪里初始化RootViewController?通常,您在applicationDidFinishLaunching(至少在iPhone上)这样做。如果你在你的应用程序委托的init方法对其进行初始化,这可能引起调用根视图控制器的viewDidLoad方法之前applicationDidFinishLaunching.

+0

谢谢,eman!基于SplitView的应用程序模板不会为RootViewController生成任何初始化代码,至少我没有在任何地方看到它。所以,由于我是新开发的iPad,并且基于自学到目前为止,我将假设RootViewController的初始化逻辑嵌入在主窗口的nib文件中,因为大部分UI都是在IB,对吗? – BeachRunnerFred 2010-05-18 03:49:38

这是由于在MainWindow.xib中,您的应用程序委托对象未连接到文件的所有者(UIApplication)而导致的可推测性。您可以打开MainWindow.xib并右键单击您的App Delegate,查看它是否在引用出口到文件的所有者中具有连接。如果不是,请将其设置为。这将解决您的问题。