Какова связь между окнами в UIApplication и окном в AppDelegate? - PullRequest
0 голосов
/ 25 июня 2018

В проекте iOS Single View App, созданном с использованием Xcode, автоматически сгенерированный AppDelegate имеет переменную экземпляра с именем window:

// In AppDelegate.swift

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

Однако синглтон UIApplication любого приложения iOS такжеимеет некоторые свойства, связанные с окном:

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

Мое предположение:

  • windows в UIApplication - это просто массив длины 1, и единственным окном в нем являетсяокно AppDelegate, а
  • keyWindows также является окном AppDelegate.

Это правильно?Какая связь между window из AppDelegate и windows из UIApplication?

1 Ответ

0 голосов
/ 25 июня 2018

Ваши догадки верны для типичного приложения.

В некоторых случаях приложение может создавать и отображать дополнительные окна. Или iOS может добавить дополнительные окна в приложение при использовании определенных функций. В этих случаях массив windows будет иметь более одного окна (включая одно, на которое ссылается делегат приложения), и keyWindow может быть любым из этих окон в течение некоторого периода времени (и не обязательно окном делегата приложения) .

Вот документация для свойства UIApplicationDelegate window:

Это свойство содержит окно, используемое для представления визуального содержимого приложения на главном экране устройства.

Реализация этого свойства требуется, если файл Info.plist вашего приложения содержит ключ UIMainStoryboardFile. К счастью, шаблоны проектов XCode обычно включают в себя синтезированное объявление свойства автоматически для делегата приложения. Значение по умолчанию для этого синтезированного свойства - nil, в результате чего приложение создает общий объект UIWindow и присваивает его свойству. Если вы хотите предоставить пользовательское окно для своего приложения, вы должны реализовать метод getter этого свойства и использовать его для создания и возврата вашего пользовательского окна.

...