【问题标题】: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是什么关系?

【问题讨论】:

    标签: ios cocoa-touch appdelegate


    【解决方案1】:

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

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

    这是UIApplicationDelegate window 属性的文档:

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

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

    【讨论】:

    • AppDelegate 的窗口会在多窗口应用的生命周期内发生变化吗?
    • 仅当您编写代码为代理的window 属性设置不同的窗口时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 2023-03-14
    相关资源
    最近更新 更多