Xcode 为什么我的应用程序代表';在我的RootViewController:viewDidLoad方法之后突然调用了s didFinishLaunchingWithOptions方法?

Xcode 为什么我的应用程序代表';在我的RootViewController:viewDidLoad方法之后突然调用了s didFinishLaunchingWithOptions方法?,xcode,iphone-sdk-3.0,interface-builder,ipad,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 {

我一直在用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;
}
#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();
    }
}
RootViewController.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;
}
#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();
    }
}
在进行任何更改之前构建并运行项目时,在调用
RootViewController:viewDidLoad
方法之前,将调用
application:didfishlaunchwithoptions
方法。我对iPhone的开发还不熟悉,但我认为这是正确和典型的顺序。这是我做的改变

  • 一旦我确认一切正常,没有任何修改,我就更改了RootViewController代码,并将其设置为
    UIViewController
    的子类(默认情况下不是
    UITableViewController
    ),并在Interface Builder中进行了相应的调整。我建造并运行,一切都很好
  • 然后,我在IB的RootView中添加了一个UIView(其中没有任何内容),当我构建并运行它时,突然在
    应用程序:didfishlaunchwithoptions
    方法之前调用了
    RootViewController:viewDidLoad
我需要让它恢复到以前的工作方式,因为正如您在代码中看到的,viewDidLoad方法依赖于要执行的didFinishLauchingWithOptions方法,因此它可以设置rootViewController的
managedObjectContext
,用于执行获取请求

  • 你知道这是什么原因吗
  • 有没有办法解决这个问题

  • 非常感谢您的帮助!我将继续研究和使用代码。

    您在哪里初始化
    RootViewController
    ?通常,您可以在
    ApplicationIDFinishLaunching
    中执行此操作(至少在iPhone上)。如果在应用程序代理的
    init
    方法中初始化它,则可能会导致根视图控制器的
    viewDidLoad
    方法在
    applicationdifinishLaunching之前被调用。

    在模板app-applicationdifinishLaunching中,将RootViewController的视图添加到窗口中,从而导致视图被加载,因此,显然-viewDidLoad将跟随-applicationdifinishlauncing

    ViewDidLoad是(间接)从ApplicationIDFinishLaunching调用的

    如您所说,如果在ApplicationIDFinishLaunching之前调用viewDidLoad,这是因为您做了一些事情,使视图在调用ApplicationIDFinishLaunching之前加载


    您是否在-viewDidLoad中添加了断点并查看stacktrace以查看调用断点的原因?

    这可能是由于在MainWindow.xib中,您的应用程序委托对象未连接到文件的所有者(UIApplication)。您可以打开MainWindow.xib并右键单击您的应用程序代理,查看它是否与文件所有者有连接。如果没有,请将其设置为。这将解决您的问题。

    谢谢,伊曼!基于SplitView的应用程序模板不会为RootViewController生成任何初始化代码,至少我在任何地方都看不到它。因此,由于我是iPad开发的新手,并且基于目前为止我自学的内容,我将假设RootViewController的初始化逻辑嵌入到主窗口的nib文件中,因为大部分UI都是在IB中创建的,对吗?