Xcode 11 beta: файл AppDelegate не имеет глобальной переменной окна

Я столкнулся с проблемой в бета-версии Xcode 11.

Проблема в том, что я не получаю переменную window по умолчанию, объявленную в AppDelegate файле.

Кто-нибудь сталкивается с такой же проблемой?


person Rashesh Bosamiya    schedule 15.06.2019    source источник
comment
Какую проблему это вызывает у вас?   -  person rmaddy    schedule 15.06.2019
comment
Я использую бета-версию Xcode 11, просто я создал приложение с одним представлением. В файле AppDelegate нет окна вызова объекта. Тогда как у нас это было в предыдущих версиях Xcode.   -  person Rashesh Bosamiya    schedule 15.06.2019
comment
И снова, какие проблемы это вызывает у вас?   -  person rmaddy    schedule 15.06.2019
comment
Я хочу использовать переменную окна для установки rootViewController. Имеет ли это смысл?   -  person Rashesh Bosamiya    schedule 15.06.2019
comment
UIApplicationDelegate уже определяет свойство window. UIApplication.shared.delegate?.window.   -  person rmaddy    schedule 15.06.2019
comment
Хорошо позвольте мне проверить   -  person Rashesh Bosamiya    schedule 15.06.2019


Ответы (4)


В Xcode 11 это теперь делается в SceneDelegate

РЕДАКТИРОВАТЬ: если вы все еще поддерживаете iOS 12 или более раннюю версию (или хотите поддерживать 13 и более раннюю версию)

Добавьте UIWindowSceneDelegate в ApplicationDelegate

Добавить: var window:UIWindow?

Затем продолжайте, как вы делали настройку в didFinishLaunching

person Michael Garcia    schedule 24.06.2019
comment
Да, но что, если целью вашего нового проекта является iOS11 или iOS12? Тогда эта строка должна быть в AppDelegate. - person dfd; 06.08.2019
comment
Вы нашли какое-нибудь решение для этого? - person prateek sharma; 30.09.2019

Окно var по умолчанию: UIWindow? Теперь перемещен в SceneDelegate.swift. Чтобы установить rootViewController в Xcode 11, вы можете работать в файле SceneDelegate.swift. В делегате сцены вы должны создать экземпляр окна и корневой контроллер представления, как показано ниже:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        // set or create your viewController here
        let yourViewController = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(identifier: "yourViewController") as! YourViewController
        // set the rootViewController here using window instance
        self.window?.rootViewController = yourViewController
    }

Также полезен этот ответ: Почему вручную настраивается корневой вид контроллер показывает черный экран?

Надеюсь, это поможет вам!

person Emdad    schedule 07.10.2019
comment
Эту функцию можно использовать только в iOS 13, поскольку она пишет - person Tj3n; 22.10.2019

Мой подход:

сначала в AppDelegate создайте статическое свойство с классом контроллера представления, к которому вы хотите получить доступ, например

class AppDelegate: UIResponder, UIApplicationDelegate {

    // MARK: Home
    static var homeViewController: HomeViewController?

    ...
}

затем в контроллере представления

// MARK: - Managing the view
override func viewDidLoad() {
    super.viewDidLoad()

    // Singleton
    AppDelegate.homeViewController = self

    ...
}

как использовать:

extension UIViewController {
    var homeViewController: HomeViewController? {
        if let controller = self as? HomeViewController {
            return controller
        }

        return AppDelegate.homeViewController
    }
}
person Miniapps    schedule 27.03.2020

В моем случае это все, что нужно.

    var window: UIWindow? // add this by yourself
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        window = UIWindow(frame: Device.bounds)
        let root = DDTabBarController()
        window?.rootViewController = root
        window?.makeKeyAndVisible()
        return true
    }
person AllenPong    schedule 05.07.2019