为什么var window: UIWindow?
不是UIWindow!
,也就是为什么让窗口可选,是不是每个应用都应该有一个主UIWindow(没有它应用程序根本无法运行)?!
我看到this answer说它确实从UIWindow!
更改为UIWindow?
所以它必须有理由。我只是想不通为什么。此外,使用UIWindow?
,主窗口的类型变为双重可选,它实在很尴尬。
答案 0 :(得分:1)
这是因为将UIMainStoryboardFile
密钥添加到应用程序的.plist文件(默认添加)是实例化窗口的原因。
window
rootViewController将包含故事板的初始视图控制器,它将在屏幕上显示。
测试一下!
我们可以让window
无效吗?
尝试从项目的.plist文件中删除UIMainStoryboardFile
行,并尝试在window
方法中记录application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?)
:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// if your removed 'UIMainStoryboardFile' key from the plist, this should prints nil
print(window)
return true
}
答案 1 :(得分:1)
我向苹果工程师提出了这个问题,以下是他的回答,
"一个示例是任何分配给故事板中某个对象的自定义类的初始化函数。初始化函数在调用该类上的任何其他方法之前运行(包括-initWithCoder:,在故事板加载期间调用它)。它们将在加载故事板时运行,但在创建窗口对象并将其分配给应用程序委托之前。初始化函数可以获取对应用程序委托的引用并尝试读取其窗口。"