xcode 添加SceneDelegate swift 5后无法访问根视图

noj0wjuj  于 2022-11-17  发布在  Swift
关注(0)|答案(2)|浏览(155)

我有一个应用程序,用户可以登录/注销,但最近当我添加了一个新的SceneDelegate视图并移过AppDelegate的代码时,该功能停止工作。我不确定为什么它不工作,但我怀疑它与在我的signOut函数中使用共享代理有关。
奇怪的事情正在发生,当我点击注销按钮时什么也没有发生。然而,当我关闭应用程序并再次打开它时,我会被注销。
以下是主屏幕上注销按钮的代码:

@IBAction func signOutButtonTapped(_ sender: Any) {
    KeychainWrapper.standard.removeObject(forKey: "accessToken")
    KeychainWrapper.standard.removeObject(forKey: "userID")
    
    // send user to splash page
    let signInPage = self.storyboard?.instantiateViewController(withIdentifier: "splashController") as! splashViewController
    let appDelegate = UIApplication.shared.delegate
    appDelegate?.window??.rootViewController = signInPage
    
}

下面是我的SceneDelegate.swift文件中的代码:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        
        guard let _ = (scene as? UIWindowScene) else { return }

        let accessToken: String? = KeychainWrapper.standard.string(forKey: "accessToken")
        
        // If access token exists, skip login page
        if accessToken != nil {            
            if let windowScene = scene as? UIWindowScene {
                self.window = UIWindow(windowScene: windowScene)
                let mainStoryboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                let vc = mainStoryboard.instantiateViewController(withIdentifier: "homeTabController") as! TabBarController
                self.window!.rootViewController = vc
            }        
        }    
    
    }
  }
ffx8fchx

ffx8fchx1#

您已经回答了自己的问题。对于场景代理,窗口属于场景代理。应用程序代理窗口为空。因此,这一行不执行任何操作:

appDelegate?.window??.rootViewController = signInPage
vfh0ocws

vfh0ocws2#

解决问题-在SceneDelegate中添加一个新变量

static weak var shared: SceneDelegate?

然后将appDelegate.window行替换为

let appDelegate = SceneDelegate.shared

相关问题