You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS开发:修改初始ViewController不生效问题求助

iOS根据登录状态切换初始页面的解决方法

为啥你的代码没生效?

  1. iOS版本适配问题:iOS13之后,App的窗口生命周期由SceneDelegate接管,不再是AppDelegate,你在AppDelegate里设置window根本不会生效。
  2. 初始化逻辑绕远路:你先实例化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:52:54