черный экран со sceneDelegate при использовании раскадровки

Сначала отображается AuthViewController (он же root), затем черный экран с tabBarController, но без элемента на нем.

В чем может быть проблема?

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

        guard let windowScene = (scene as? UIWindowScene) else { return }
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.windowScene = windowScene

        if let user = Auth.auth().currentUser {
            FirestoreServices.shared.getUserData(user: user) { (result) in
                switch result {
                case .success(let muser):
                    let mainTabBar = MainTabBarViewController()
                    mainTabBar.currentUser = muser
                    mainTabBar.modalPresentationStyle = .fullScreen
                    self.window?.rootViewController = mainTabBar
                case .failure(_):
                    self.window?.rootViewController = AuthViewController()
                }
            }
        } else {
            self.window?.rootViewController = AuthViewController()
        }
        window?.makeKeyAndVisible()
    } 

person Евгений    schedule 13.06.2020    source источник


Ответы (1)


РЕДАКТИРОВАТЬ: вам нужно создать экземпляр из раскадровки, так как вы используете раскадровку. Вам необходимо инициализировать переменную вашего окна window с помощью windowScene.

var window: UIWindow?

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

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

        window = UIWindow(windowScene: windowScene)
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        if let user = Auth.auth().currentUser {
            FirestoreServices.shared.getUserData(user: user) { (result) in
                switch result {
                case .success(let muser):
                    let mainTabBar = storyboard.instantiateViewController(withIdentifier: "viewControllerIDInStoryboard") as! TabViewController
                    mainTabBar.currentUser = muser
                    mainTabBar.modalPresentationStyle = .fullScreen
                    self.window?.rootViewController = mainTabBar
                    print("BLA BLA \(String(describing: self.window?.frame))")
                case .failure(_):
                    let authVC = storyboard.instantiateViewController(withIdentifier: "viewControllerIDInStoryboard") as! AuthViewController
                    self.window?.rootViewController = authVC
                }
            }
        } else {
            let authVC = storyboard.instantiateViewController(withIdentifier: "viewControllerIDInStoryboard") as! AuthViewController
            self.window?.rootViewController = authVC
        }
        window?.makeKeyAndVisible()
    } 
person rs7    schedule 13.06.2020
comment
Я обновил код в посте. Ваш ответ мне не помог ( - person Евгений; 13.06.2020
comment
Это работает, если вы не используете раскадровку, но мне нужно использовать раскадровку - person Евгений; 13.06.2020
comment
Если вы используете раскадровку, первый код будет работать. Я только что это проверил. Убедитесь, что у вас нет ViewController в раскадровке, который установлен в качестве начального View Controller (на него не должна указывать стрелка) - person rs7; 13.06.2020
comment
Убрал стрелку из раскадровки, но проблема не исчезла, теперь показывает черный экран и через полсекунды показывает черный экран с TabBar - person Евгений; 13.06.2020
comment
Хорошо, я обновил свой ответ. Если вы используете раскадровку, вам необходимо создать экземпляры ViewControllers из раскадровки. - person rs7; 13.06.2020