Ios 为什么要将UIApplicationLegate中的窗口属性设置为可选而不是隐式取消包装的可选?
为什么Ios 为什么要将UIApplicationLegate中的窗口属性设置为可选而不是隐式取消包装的可选?,ios,swift,optional,uiwindow,Ios,Swift,Optional,Uiwindow,为什么var窗口:UIWindow?不是UIWindow,即为什么使窗口成为可选窗口,不是每个应用程序都应该有一个主UIWindow(没有主UIWindow,应用程序根本无法运行) 我看到有人说它确实从ui窗口改变了到ui窗口?所以它一定有原因。我就是不明白为什么。另外,使用UIWindow?,主窗口的类型变得双重可选,这真的很尴尬。这是因为将UIMainstryBoardFile键添加到应用程序的.plist文件(默认情况下添加)中是实例化窗口的原因 windowrootViewContro
var窗口:UIWindow?
不是UIWindow代码>,即为什么使窗口成为可选窗口,不是每个应用程序都应该有一个主UIWindow(没有主UIWindow,应用程序根本无法运行)
我看到有人说它确实从ui窗口改变了代码>到ui窗口?
所以它一定有原因。我就是不明白为什么。另外,使用UIWindow?
,主窗口的类型变得双重可选,这真的很尴尬。这是因为将UIMainstryBoardFile
键添加到应用程序的.plist文件(默认情况下添加)中是实例化窗口的原因
window
rootViewController将包含故事板的初始视图控制器,它将在屏幕上可见
测试它强>
我们可以让窗口为零吗
尝试从项目的.plist文件中删除UIMainStoryboardFile
行,并尝试在应用程序中记录窗口
(\uApplication:UIApplication,didFinishLaunchingWithOptions launchOptions:[uiApplicationLaunchOptions:[uiApplicationLaunchOptions: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
}
我向苹果工程师提出了这个问题,下面是他的回答:
例如,任何自定义类上的初始值设定项函数都分配给情节提要中的某个对象。在调用该类上的任何其他方法之前,都会运行初始值设定项函数(包括-initWithCoder:,在情节提要加载期间调用该方法)。它们将在加载到情节提要时运行,但在创建窗口对象并将其分配给应用程序委托之前。初始化器函数可以获取对应用程序委托的引用并尝试读取其窗口。“实际上,我知道UIMainstryBoardFile创建了它(正如apple文档所述)。但是如果没有UIWindow,应用程序根本无法运行,那么让它成为可选的目的是什么呢?因为在某些情况下(如回答中的“测试它!”部分所述),键可能不存在,所以在这种情况下,窗口将为零,而你将看到的只是一个黑色屏幕我看到了你的观点,但你似乎没有理解我的观点,例如,谁将制作一个黑屏应用程序,使该应用程序完全无法运行?我想我明白了。。。苹果表示:“UIWindow对象为应用程序的用户界面提供背景,并提供重要的事件处理行为”,这意味着窗口是添加在黑屏之上的一层。