Xcode 为什么我的应用程序代表';在我的RootViewController:viewDidLoad方法之后突然调用了s didFinishLaunchingWithOptions方法?
我一直在用Xcode玩iPad的SplitView模板。以下是基于拆分视图的应用程序模板为您自动生成的许多重要方法中的两个 AppNameAppDelegate.mXcode 为什么我的应用程序代表';在我的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 {
#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
),并在Interface Builder中进行了相应的调整。我建造并运行,一切都很好李>UITableViewController
- 然后,我在IB的RootView中添加了一个UIView(其中没有任何内容),当我构建并运行它时,突然在
方法之前调用了应用程序:didfishlaunchwithoptions
李>RootViewController:viewDidLoad
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中创建的,对吗?