2016-11-07 13 views
2

Почему var window: UIWindow? не UIWindow!, то есть почему создание окна необязательно, не каждое приложение должно иметь основной UIWindow (без него приложение не может функционировать вообще)?!Зачем создавать свойство окна в UIApplicationDelegate необязательно вместо неявно разворачиваемого необязательного?

Я видел this answer сказал, что действительно изменился с UIWindow! на UIWindow?, поэтому у него должна быть причина. Я просто не могу понять, почему. Кроме того, с UIWindow?, тип главного окна становится двойным по величине, это действительно неудобно.

ответ

1

Это потому, что добавление UIMainStoryboardFile ключа в файл .plist приложения (который добавляется по умолчанию) является причиной создания экземпляра окна.

enter image description here

window RootViewController будет содержит начальный контроллер представления раскадровки и это будет видно на экране.

Проверьте это!

можно ли оставить window ноль?

попытки удалить UIMainStoryboardFile строки из .plist файла проекта и попытаться войти метод window в application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: 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 
} 
+0

На самом деле, я знаю, что UIMainStoryboardFile создает его (как сказано в документе Apple). Но без UIWindow приложение не может функционировать вообще, поэтому какова цель сделать его необязательным? – Qiulang

+0

, потому что в некоторых случаях (как указано в разделе «Проверить это!» в ответе), ключ может не существовать, поэтому в этом случае окно будет равно нулю, и все, что вы увидите, - это черный экран –

+0

Я видел ваши баллы, но вы, похоже, не получите мои, например, кто сделает приложение с черным экраном, которое делает приложение недействительным вообще? – Qiulang

1

Я поднял этот вопрос инженер яблочного и следующий его ответ,

«Примером может быть функция инициализатора для любого пользовательского класса, назначенного одному из объектов в вашем раскадровке. Функции инициализатора запускаются до вызова любого другого метода в этом классе (включая -initWithCoder :, который вызывается во время раскадровки загрузка) , Они будут запускаться, пока загружается раскадровка, но до того, как объект окна будет создан и назначен делегату приложения. Функция инициализатора могла получить ссылку на делегат приложения и попытаться прочитать ее окно ».