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
的窗口。
这是正确的吗? AppDelegate
的window
和UIApplication
的windows
是什么关系?
【问题讨论】:
【参考方案1】:对于典型应用,您的猜测是正确的。
在某些情况下,应用可能会创建并显示其他窗口。或者,iOS 可能会在使用某些功能时向应用程序添加额外的窗口。在这些情况下,windows
数组将有多个窗口(包括应用程序委托引用的窗口),并且 keyWindow 在一段时间内可能是这些窗口中的任何一个(不一定是应用程序委托的窗口) .
这是UIApplicationDelegate window
属性的文档:
此属性包含用于在设备主屏幕上呈现应用可视内容的窗口。
如果您的应用程序的
Info.plist
文件包含UIMainStoryboardFile
键,则需要实现此属性。幸运的是,Xcode 项目模板通常包含自动为应用程序委托合成的属性声明。此合成属性的默认值为nil
,这会导致应用程序创建一个通用的UIWindow
对象并将其分配给该属性。如果您想为您的应用提供自定义窗口,则必须实现该属性的 getter 方法并使用它来创建和返回您的自定义窗口。
【讨论】:
AppDelegate 的窗口会在多窗口应用的生命周期内发生变化吗? 仅当您编写代码为代理的window
属性设置不同的窗口时。以上是关于UIApplication 中的窗口和 AppDelegate 中的窗口是啥关系?的主要内容,如果未能解决你的问题,请参考以下文章
从 iOS 框架引用 UIApplication 或 AppDelegate 窗口属性会导致应用被 App Store 拒绝吗?