Как заставить Onboarding работать с Scene Delegate в iOS13? - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь настроить свой входящий экран в SceneDelegate.

Когда я запускаю приведенный ниже код, он компилируется, но просто переходит на черный экран.

Это много хороших учебных пособий для AppDelegate, но очень мало для нового SceneDelegate с iOS13. Я взял это руководство и попытался применить его к SceneDelegate, но не могу заставить его работать: https://www.youtube.com/watch?v=y6t1woVd6RQ&t=537s

Это мой код делегата сцены.

    var window: UIWindow?

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

        let launchedBefore = UserDefaults.standard.bool(forKey: "hasLaunched")
        self.window = UIWindow(frame: UIScreen.main.bounds)
        let launchStoryboard = UIStoryboard(name: "Onboarding", bundle: nil)
        let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
        var vc: UIViewController
        if launchedBefore
        {
            vc = mainStoryboard.instantiateInitialViewController()!
        }
        else
        {
            vc = launchStoryboard.instantiateViewController(identifier: "Onboarding")
        }
        UserDefaults.standard.set(true, forKey: "hasLaunched")
        self.window?.rootViewController = vc
        self.window?.makeKeyAndVisible()

    //    guard let _ = (scene as? UIWindowScene) else { return }
    }

Я пробовал это как закомментировать последнее охранное заявление, так и не закомментировать его.

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Это было решено Мэттом, смотрите его ответ.

Просто отправьте правильный код ниже для тех, кто пытается сделать Onboarding с раскадровками в ios13.

    var window: UIWindow?

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

        let launchedBefore = UserDefaults.standard.bool(forKey: "hasLaunched")
        let launchStoryboard = UIStoryboard(name: "Onboarding", bundle: nil)
        let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
        var vc: UIViewController
        if launchedBefore
        {
            vc = mainStoryboard.instantiateInitialViewController()!
        }
        else
        {
            vc = launchStoryboard.instantiateViewController(identifier: "OnboardingScene")
        }
        UserDefaults.standard.set(true, forKey: "hasLaunched")
        self.window?.rootViewController = vc
    }
1 голос
/ 07 марта 2020

Вы неправильно создаете окно, поэтому в итоге вы получите черный экран. Было бы намного лучше позволить раскадровке создать окно для вас, так как вы не знаете, как это сделать. Просто удалите эту строку полностью:

self.window = UIWindow(frame: UIScreen.main.bounds)

Вы также можете вырезать эту строку, так как она также является otiose (раскадровка сделает это и для вас):

self.window?.makeKeyAndVisible()

Ваша единственная теперь ответственность заключается в том, чтобы установить значение self.window?.rootViewController. Обратите внимание, что вам не нужно произносить

vc = mainStoryboard.instantiateInitialViewController()!

, потому что это уже контроллер вида root, предоставленный вам раскадровкой. Таким образом, единственная вещь, которую вам нужно сделать в предложенной вами архитектуре, - это заменить контроллер представления root в ситуации, когда пользователь должен быть включен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...