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

Bea*_*red 6 xcode interface-builder iphone-sdk-3.0 ipad

我一直在使用Xcode中的iPad的SplitView模板.以下是基于Split View的应用程序模板为您自动生成的许多重要方法中的两个...

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;
}
Run Code Online (Sandbox Code Playgroud)

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在进行任何更改之前构建并运行项目时,将application:didFinishLaunchingWithOptions在调用RootViewController:viewDidLoad方法之前调用该方法.我是iPhone开发的新手,但我认为这是正确而典型的序列.所以这是我所做的改变......

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

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

  1. 是什么原因引起了这个?
  2. 我有什么想法可以解决这个问题?

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

hoo*_*oop 5

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

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

如果,如您所说,在 applicationDidFinishLaunching 之前调用 viewDidLoad,那是因为您在调用 applicationDidFinishLaunching 之前做了一些事情导致视图加载。

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