iOS开发:修改初始ViewController不生效问题求助
iOS根据登录状态切换初始页面的解决方法
为啥你的代码没生效?
- iOS版本适配问题:iOS13之后,App的窗口生命周期由
SceneDelegate接管,不再是AppDelegate,你在AppDelegate里设置window根本不会生效。 - 初始化逻辑绕远路:你先实例化Storyboard默认的导航控制器,再替换它的根VC,这种方式容易被Storyboard的默认配置干扰,不如直接根据登录状态创建对应的VC,再套导航控制器。
正确实现步骤
第一步:先写个判断登录状态的方法
先把登录状态判断抽成一个方法,方便复用:
func isUserLoggedIn() -> Bool { // 这里换成你实际的判断逻辑,比如从UserDefaults读token或者登录标记 return UserDefaults.standard.bool(forKey: "hasLoggedIn") }
第二步:分版本配置初始页面
如果你要兼容iOS12及以下(只用AppDelegate)
修改AppDelegate里的application(_:didFinishLaunchingWithOptions:)方法:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { let mainStoryboard = UIStoryboard(name: "Main", bundle: nil) var initialVC: UIViewController // 根据登录状态选初始页面 if isUserLoggedIn() { // 已登录,跳首页 initialVC = mainStoryboard.instantiateViewController(withIdentifier: "HomeVC") as! HomeVC } else { // 未登录,跳登录页 initialVC = mainStoryboard.instantiateViewController(withIdentifier: "LoginVC") as! LoginVC } // 用导航控制器包裹初始页面 let navVC = UINavigationController(rootViewController: initialVC) // 手动初始化window并设置根控制器 self.window = UIWindow(frame: UIScreen.main.bounds) self.window?.rootViewController = navVC self.window?.makeKeyAndVisible() return true }
如果你只兼容iOS13及以上(用SceneDelegate)
修改SceneDelegate的scene(_:willConnectTo:options:)方法:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = scene as? UIWindowScene else { return } let mainStoryboard = UIStoryboard(name: "Main", bundle: nil) var initialVC: UIViewController if isUserLoggedIn() { initialVC = mainStoryboard.instantiateViewController(withIdentifier: "HomeVC") as! HomeVC } else { initialVC = mainStoryboard.instantiateViewController(withIdentifier: "LoginVC") as! LoginVC } let navVC = UINavigationController(rootViewController: initialVC) self.window = UIWindow(windowScene: windowScene) self.window?.rootViewController = navVC self.window?.makeKeyAndVisible() }
几个关键注意点
- 确保Storyboard里的首页和登录页都设置了正确的Storyboard ID,要和代码里的标识符完全一致(比如代码里写的是
HomeVC,Storyboard里也得设成这个)。 - 别在Storyboard里设置初始ViewController,留空,完全靠代码控制。
- 登录/退出后要切换页面的话,可以用下面的方法(带过渡动画):
func switchRootViewController() { let mainStoryboard = UIStoryboard(name: "Main", bundle: nil) let targetVC = isUserLoggedIn() ? mainStoryboard.instantiateViewController(withIdentifier: "HomeVC") as! HomeVC : mainStoryboard.instantiateViewController(withIdentifier: "LoginVC") as! LoginVC let navVC = UINavigationController(rootViewController: targetVC) if let window = UIApplication.shared.windows.first { window.rootViewController = navVC // 加个过渡动画,体验更好 UIView.transition(with: window, duration: 0.3, options: .transitionCrossDissolve, animations: nil) } }
内容的提问来源于stack exchange,提问作者Neha
相关产品推荐
相关产品推荐

