iOS self.window – 它是什么时候创build的?

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

但是,当您使用空模板启动应用程序并尝试将self.windowlogging到控制台时,结果将返回null 。 即使添加了Storyboard和一个视图控制器,并将其视图控制器设置为初始视图控制器,并尝试loggingself.window ,结果也是一样的 – 它的值设置为null

并注意,无论你采取什么方式,你可以find你声明@property (strong, nonatomic) UIWindow *window; 在AppDelegate.h默认情况下。 所以我想知道为什么在第一种情况下,你可以看到self.window被初始化并设置了这个值,但是在后一种情况下没有。 另外,如果self.window已经在第一种情况下被声明和初始化,而在第二种情况下则不是,我怎样才能find初始化代码呢?

看起来在这两种情况下, @property声明是相同的 – 在这两种情况下,正如我所提到的,我尝试在AppDelegate.mapplication: didFinishLaunchingWithOptions:的第一行loggingself.window的值application: didFinishLaunchingWithOptions:方法。

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

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

好的,当您使用Storyboard或Nib创build项目时,项目设置会告诉项目storyboard / nib是“主界面”。

这会触发应用程序在启动时加载该接口。 这就是为什么在这些情况下创buildself.window

当你创build一个空的应用程序时,没有可以设置为主界面的界面。

然后你需要像这样自己创build窗口…

 -(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]; } 

无论如何这样的东西。 有一阵子了。

另外,如果你创build一个空的应用程序,然后添加一个你想用作初始笔尖的nib文件,那么你可以在项目设置中select它。

在一般的目标。 在“部署信息”一节中,从项目中的笔尖select“主界面”。 这将在应用程序启动时加载该笔尖。

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

现在在空项目中,如果你想创build窗口声明它作为出口,并连接它存在于笔尖的窗口,并使您的AppDelegate作为文件OWNER。