我正在寻找在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。
有人对此有解决方案吗?
我建议您在自己的某些类中创建窗口时将其存储起来,以便更好地使用,但是您也可以通过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>>)