UIApplication 中的窗口和 AppDelegate 中的窗口是啥关系?

Posted

技术标签:

【中文标题】UIApplication 中的窗口和 AppDelegate 中的窗口是啥关系?【英文标题】:What is the relationship between the windows in UIApplication and window in AppDelegate?UIApplication 中的窗口和 AppDelegate 中的窗口是什么关系? 【发布时间】:2018-06-25 16:51:34 【问题描述】:

在使用 Xcode 创建的 ios Single View App 项目中,自动生成的 AppDelegate 有一个名为 window 的实例变量:

// In AppDelegate.swift

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate 
  // ...
  var window: UIWindow?
  // ...

不过,任何 iOS 应用的 UIApplication 单例也有一些与窗口相关的属性:

open class UIApplication : UIResponder 
  // ...
  open var keyWindow: UIWindow?  get 
  open var windows: [UIWindow]  get 
  // ...

我的猜测:

windows in UIApplication 只是一个长度为 1 的数组,其中唯一的窗口是 AppDelegate 的窗口,并且 keyWindows 也是AppDelegate 的窗口。

这是正确的吗? AppDelegatewindowUIApplicationwindows是什么关系?

【问题讨论】:

【参考方案1】:

对于典型应用,您的猜测是正确的。

在某些情况下,应用可能会创建并显示其他窗口。或者,iOS 可能会在使用某些功能时向应用程序添加额外的窗口。在这些情况下,windows 数组将有多个窗口(包括应用程序委托引用的窗口),并且 keyWindow 在一段时间内可能是这些窗口中的任何一个(不一定是应用程序委托的窗口) .

这是UIApplicationDelegate window 属性的文档:

此属性包含用于在设备主屏幕上呈现应用可视内容的窗口。

如果您的应用程序的 Info.plist 文件包含 UIMainStoryboardFile 键,则需要实现此属性。幸运的是,Xcode 项目模板通常包含自动为应用程序委托合成的属性声明。此合成属性的默认值为nil,这会导致应用程序创建一个通用的UIWindow 对象并将其分配给该属性。如果您想为您的应用提供自定义窗口,则必须实现该属性的 getter 方法并使用它来创建和返回您的自定义窗口。

【讨论】:

AppDelegate 的窗口会在多窗口应用的生命周期内发生变化吗? 仅当您编写代码为代理的window 属性设置不同的窗口时。

以上是关于UIApplication 中的窗口和 AppDelegate 中的窗口是啥关系?的主要内容,如果未能解决你的问题,请参考以下文章

谓词不适用于 CoreData - Swift 4

从 iOS 框架引用 UIApplication 或 AppDelegate 窗口属性会导致应用被 App Store 拒绝吗?

iOS中的事件传递和响应者链条

iOS中的事件传递和响应者链

使用 Core Data 解包 Optional 值时意外发现 nil

每当它从后台或暂停返回时,iOS 都会执行操作