为什么我的应用委托的didFinishLaunchingWithOptions方法突然被我的RootViewController调用:viewDidLoad方法?

时间:2010-05-17 23:15:33

标签: xcode iphone-sdk-3.0 interface-builder ipad

我一直在使用Xcode中的iPad的SplitView模板。以下是基于拆分视图的应用程序模板自动生成的许多重要方法中的两个...

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方法之前调用RootViewController:viewDidLoad方法。我是iPhone开发的新手,但我认为这是正确而典型的序列。所以这是我所做的改变......

  • 一旦我确认所有内容都没有任何修改,我更改了RootViewController代码并将其设置为UIViewController的子类(默认情况下代替UITableViewController)并在Interface Builder中进行了相应的调整。我建立并运行,一切仍然正常。
  • 然后,我在IB中的RootView中添加了一个UIView(其中没有任何内容),当我构建并运行它时,突然在RootViewController:viewDidLoad方法之前调用了application:didFinishLaunchingWithOptions

我需要让它恢复到以前的工作方式,因为正如您在代码中看到的那样,viewDidLoad方法依赖于didFinishLauchingWithOptions方法来执行,因此它可以设置它使用的rootViewController的managedObjectContext执行获取请求。

  1. 是什么原因引起了这个?
  2. 我有什么想法可以解决这个问题吗?
  3. 非常感谢您的帮助!我会继续研究和玩代码。

3 个答案:

答案 0 :(得分:4)

在模板应用程序中-applicationDidFinishLaunching将RootViewController的视图添加到窗口,导致视图加载,所以很明显-viewDidLoad将跟随 - applicationDidFinishLaunching。

从applicationDidFinishLaunching(间接)调用ViewDidLoad。

正如你所说的那样,在applicationDidFinishLaunching之前调用viewDidLoad是因为你在调用applicationDidFinishLaunching之前已经做了一些事情来导致视图加载。

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

答案 1 :(得分:2)

您在哪里初始化RootViewController?通常,您在applicationDidFinishLaunching(至少在iPhone上)这样做。如果您在应用委托的init方法中对其进行初始化,则可能导致在viewDidLoad

之前调用根视图控制器的applicationDidFinishLaunching.方法

答案 2 :(得分:2)

这是因为在MainWindow.xib中,您的应用程序委托对象未连接到File的所有者(UIApplication)这一事实。您可以打开MainWindow.xib并右键单击App Delegate,查看它是否在引用Outlet到File的所有者中有连接。如果没有,请将其设置为。这将解决您的问题。