假设我不使用故事板。在我看到的应用程序委托中的所有示例中,window属性都是在willFinishLaunchingWithOptions或didFinishLaunchingWithOptions中初始化的。为什么不在对象初始化阶段?我试过这样做,看起来一切都很好。
Upd:说得更清楚。此代码是否包含任何隐藏的问题?
class MyAppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow? = UIWindow(frame: UIScreen.mainScreen().bounds)
func application(application: UIApplication, willFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {
window?.rootViewController = UIViewController() //just template to make compile possible
window?.makeKeyAndVisible()
return true
}
/* ... */
}发布于 2018-02-15 10:04:29
我有基于这个问题的实验和研究。
首先,让我们看看UIApplicationDelegate窗口属性上的Apple:
如果应用程序的Info.plist文件包含UIMainStoryboardFile键,则需要实现此属性。幸运的是,Xcode项目模板通常包括应用程序委托自动合成的属性声明。此合成属性的默认值为零,这将导致应用程序创建一个通用UIWindow对象并将其分配给该属性。如果要为应用程序提供自定义窗口,则必须实现该属性的getter方法,并使用它创建和返回自定义窗口。
因此,如果代码在UIMainStoryboardFile中不使用Info.plist选项,则必须自行设置窗口。我的实验表明,UIApplication根本不调用窗口属性。仅在willFinishLaunchingWithOptions方法中调用Getter。据我所见,这种方法没有隐藏的问题。
如果要使用UIMainStoryboardFile选项,可以将窗口创建留给UIApplication。在应用程序的启动过程中,UIApplication会检查Info.plist是否有UIMainStoryboardFile键,如果提供了故事板,它将向AppDelegate询问窗口:
rootViewController分配给它并在AppDelegate中设置它。rootViewController分配给它。https://stackoverflow.com/questions/39021203
复制相似问题