在XCode 11.2中登录后更改RootViewController

问题描述 投票:0回答:1

我正在寻找在XCode 11.2中按下登录按钮后更改rootViewController的解决方案

我知道以下代码,这些代码可用于在初始应用程序启动时以编程方式设置rootView控制器。

@available(iOS 13.0, *)
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
    guard let windowsScene = (scene as? UIWindowScene) else { return }

    if UserDefaults.Account.bool(forKey: .isUserLoggedIn) {

        let homeVC = HomeVC.viewController()
        let navController = UINavigationController(rootViewController: homeVC)
        navController.setNavigationBarHidden(true, animated: false)

        let sideMenu = SideMenuVC.viewController()

        let sideMenuController = LGSideMenuController(rootViewController: navController, leftViewController: sideMenu, rightViewController: nil)

        sideMenuController.leftViewWidth = 250.0
        sideMenuController.leftViewPresentationStyle = .slideBelow

        window = UIWindow(windowScene: windowsScene)
        window?.rootViewController = sideMenuController
        window?.makeKeyAndVisible()

    } else {

        if UserDefaults.Account.bool(forKey: .isServiceLoggedIn) {

            let serviceProfileVC = ServiceProfileVC.viewController()
            let navController = UINavigationController(rootViewController: serviceProfileVC)
            navController.setNavigationBarHidden(true, animated: false)

            let sideMenu = SideMenuVC.viewController()

            let sideMenuController = LGSideMenuController(rootViewController: navController, leftViewController: sideMenu, rightViewController: nil)

            sideMenuController.leftViewWidth = 250.0
            sideMenuController.leftViewPresentationStyle = .slideBelow

            window?.rootViewController = sideMenuController
            window?.makeKeyAndVisible()

        } else {

            let loginVC = LoginVC.viewController()
            let navController = UINavigationController(rootViewController: loginVC)
            navController.setNavigationBarHidden(true, animated: false)
            window?.rootViewController = navController
            window?.makeKeyAndVisible()
        }
    }
}

上面的代码在应用程序启动时工作完美。但是我对如何在按下登录按钮时执行以上代码感到困惑。

窗口的主要问题,在早期的XCodes提供的AppDelegate中找不到UIWindow的实例。第二件事,我知道SceneDelegate中有可用的窗口实例,但是当我尝试使用共享实例进行访问时,发现它为nil。

有人对此有解决方案吗?

swift appdelegate uiwindow xcode11.2 uiscenedelegate
1个回答
-1
投票

我建议您在自己的某些类中创建窗口时将其存储起来,以便更好地使用,但是您也可以通过UIScene找到它,如下所示(如果有很多窗口,可以对其进行过滤以准确提取您的):

if let delegate = UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate {
    print("got delegate window: \(delegate.window)")
}

输出:

got delegate window: Optional(<UIWindow: 0x7f8cb2d04480; 
frame = (0 0; 375 667); gestureRecognizers = <NSArray: 0x600003d34c60>; 
layer = <UIWindowLayer: 0x600003334f00>>)
© www.soinside.com 2019 - 2024. All rights reserved.