首页 > 解决方案 > SceneDelegate中Launch和第一个ViewController之间黑屏闪烁

问题描述

我正在使用 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 秒),具体取决于加载时间。对不起质量差和持续时间短,但你会看到它:

在此处输入图像描述

这个黑屏是哪里来的?

标签: swiftuiviewcontroller

解决方案


该问题似乎是由启动故事板和可见窗口之间的演示文稿中的“间隙”引起的。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))
            }
        }
    }
}

推荐阅读