iOS self.window - 何时创建?

Bla*_*ard 7 objective-c uiwindow ios appdelegate

当您使用单一视图模板启动应用程序,并NSLog(@"self.window = %@", self.window);在AppDelegate.m application: didFinishLaunchingWithOptions:方法的第一行添加时,您可以看到self.window应用程序中存在该应用程序.

但是,当您使用空模板启动应用程序并尝试将其记录self.window到控制台时,结果将返回null.即使您添加了故事板和视图控制器,并将其视图控制器设置为初始视图控制器,并尝试记录self.window,结果也是相同的 - 其值设置为null.

请注意,无论采用哪种方式,您都可以@property (strong, nonatomic) UIWindow *window;在AppDelegate.h中默认声明.所以我想知道为什么在第一种情况下,你可以看到它self.window被初始化并设置值但不是后一种情况.另外,如果self.window已经在第一种情况下声明并初始化但在第二种情况下不是,那么如何找到初始化代码?

它看起来像在这两种情况下,该@property声明是一样的-在这两种情况下,正如我所说,我试图登录的值self.window在第一线AppDelegate.mapplication: didFinishLaunchingWithOptions:方法.

那么我错过了什么?我不知道为什么这两个案例的行为不同,尽管我没有在代码和故事板中发现任何差异.

我使用iOS 7和Xcode 5.谢谢.

Fog*_*ter 9

好的,当您使用Storyboard或Nib创建项目时,项目设置将告诉项目storyboard/nib是"主界面".

这会触发应用程序在启动时加载该接口.这就是self.window在这些情况下创建的原因.

创建空应用程序时,没有要设置为主界面的界面.

然后你需要像这样自己创建窗口......

-(void)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

     UIViewController *someController = [UIViewController... //create your initial controller

    [self.window addSubview:navigationController.view];
    [self.window makeKeyAndVisible];
}
Run Code Online (Sandbox Code Playgroud)

无论如何这样的事情.有一阵子了.

或者,如果您创建一个空应用程序,然后添加要用作初始笔尖的nib文件,则可以在项目设置中选择它.

在目标中.在"部署信息"部分中,从项目中的nib中选择"主界面".然后,这将在应用程序启动时加载该nib.