当您使用单一视图模板启动应用时,如果在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.谢谢。
答案 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。