黑屏在SceneDelegate中的Launch和第一个ViewController之间闪烁

时间:2019-12-07 11:55:34

标签: swift uiviewcontroller

我正在使用SceneDelegate.swift来确定使用此代码显示哪个ViewController:

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

    if Auth.auth().currentUser != nil {

        AuthenticationService.automaticSignIn(onSuccess: {

            let window = UIWindow(windowScene: windowScene)
            self.window = window
            let mainstoryboard:UIStoryboard = UIStoryboard(name: "Login", bundle: nil)
            let newViewcontroller:UIViewController = mainstoryboard.instantiateViewController(withIdentifier: "TabBarControllerID") as! TabBarController
            window.rootViewController = newViewcontroller
            window.makeKeyAndVisible()

        }, onError: {

            let window = UIWindow(windowScene: windowScene)
            self.window = window
            let mainstoryboard:UIStoryboard = UIStoryboard(name: "Login", bundle: nil)
            let newViewcontroller:UIViewController = mainstoryboard.instantiateViewController(withIdentifier: "LoginViewControllerID") as! LoginViewController
            window.rootViewController = newViewcontroller
            window.makeKeyAndVisible()

        })
    } else {

        let window = UIWindow(windowScene: windowScene)
        self.window = window
        let mainstoryboard:UIStoryboard = UIStoryboard(name: "Login", bundle: nil)
        let newViewcontroller:UIViewController = mainstoryboard.instantiateViewController(withIdentifier: "LoginViewControllerID") as! LoginViewController
        window.rootViewController = newViewcontroller
        window.makeKeyAndVisible()
    }
}

在过渡之间,出现黑屏(在我的.gif中显示约0.2秒),具体取决于加载时间。很抱歉,质量不好而且持续时间短,但是您会看到的:

enter image description here

黑屏是哪里来的?

2 个答案:

答案 0 :(得分:0)

尝试更改此行:-
self.window!.rootViewController = UINavigationController(rootViewController:DashboardVC)
self.window!.makeKeyAndVisible()

答案 1 :(得分:0)

问题似乎是由启动故事板和可见窗口之间的演示文稿中的“空白”引起的。 appleIDProvider是异步的。

一种解决方法(而不是解决方法)是提供一个临时视图(具有与启动故事板相同的颜色或内容),并在授权完成后将其替换;

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

    guard let windowScene = scene as? UIWindowScene else { return }
    let window = UIWindow(windowScene: windowScene)
    window.rootViewController = UIHostingController(rootView: TempView())
    self.window = window
    window.makeKeyAndVisible()

    let user = User.shared
    let appleIDProvider = ASAuthorizationAppleIDProvider()

    appleIDProvider.getCredentialState(forUserID: user.id) { (credentialState, error) in
        switch credentialState {
        case .authorized:
            DispatchQueue.main.async {
                user.authenticated =  true
                window.rootViewController = UIHostingController(rootView: HomeView(showAlert: false, showSendview: false, showAccountview: false))
            }
        default:
            DispatchQueue.main.async {
                user.authenticated = false
                window.rootViewController = UIHostingController(rootView: SignInView().environment(\.window, window))
            }
        }
    }
}