首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现UIApplicationDelegate协议的窗口属性

实现UIApplicationDelegate协议的窗口属性
EN

Stack Overflow用户
提问于 2016-08-18 14:44:07
回答 1查看 1.9K关注 0票数 2

假设我不使用故事板。在我看到的应用程序委托中的所有示例中,window属性都是在willFinishLaunchingWithOptionsdidFinishLaunchingWithOptions中初始化的。为什么不在对象初始化阶段?我试过这样做,看起来一切都很好。

Upd:说得更清楚。此代码是否包含任何隐藏的问题?

代码语言:javascript
复制
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
    }
    /* ... */
}
EN

回答 1

Stack Overflow用户

发布于 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询问窗口:

  • 如果窗口为零,UIApplication将创建一个窗口,将rootViewController分配给它并在AppDelegate中设置它。
  • 如果窗口不是零,则UIApplication将rootViewController分配给它。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39021203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档