iOS self.window - 何时创建?

时间:2014-01-27 12:11:12

标签: ios objective-c appdelegate uiwindow

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

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

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

在两种情况下,@property声明都是相同的 - 在这两种情况下,正如我所提到的,我试图在{{1的第一行中记录self.window的值}} AppDelegate.m方法。

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

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

2 个答案:

答案 0 :(得分: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];
}

无论如何都是这样的。已经有一段时间了。

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

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

答案 1 :(得分:0)

Xcode在UIWindow中将IBOutlet声明为Appdelegate对象,xcode本身将其与默认ViewController.nib(在创建非空项目时由Xcode创建)的窗口挂钩或连接。如果已将其声明为Iboutlet并将其与nib中的任何UIController连接,则无需初始化任何对象。

现在在空项目中,如果你想创建窗口,将其声明为outlet并将其与nib中存在的窗口连接,并将你的AppDelegate作为Files OWner。