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

如何让登录界面在主界面之前显示(iOS Swift开发)

实现启动屏后优先显示登录/注册页的方案

以下是基于UIKit(故事板)的两种实现方式,适配不同iOS版本:

一、iOS 13及以上(使用SceneDelegate)

  1. 给故事板中的登录/注册页、主界面分别设置Storyboard ID(比如登录页设为LoginVC,主界面设为MainVC)。
  2. 打开SceneDelegate.swift,修改scene(_:willConnectTo:options:)方法:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let windowScene = (scene as? UIWindowScene) else { return }
    
    let window = UIWindow(windowScene: windowScene)
    self.window = window
    
    // 用UserDefaults存储登录状态,首次启动默认未登录
    let isLoggedIn = UserDefaults.standard.bool(forKey: "hasLoggedIn")
    
    let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let initialVC: UIViewController
    
    if isLoggedIn {
        initialVC = mainStoryboard.instantiateViewController(withIdentifier: "MainVC")
    } else {
        initialVC = mainStoryboard.instantiateViewController(withIdentifier: "LoginVC")
    }
    
    window.rootViewController = initialVC
    window.makeKeyAndVisible()
}
  1. 登录成功后更新状态并切换到主界面:
// 登录成功时执行
UserDefaults.standard.set(true, forKey: "hasLoggedIn")
UserDefaults.standard.synchronize()

// 切换主界面
let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
let mainVC = mainStoryboard.instantiateViewController(withIdentifier: "MainVC")
if let sceneDelegate = UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate {
    sceneDelegate.window?.rootViewController = mainVC
    sceneDelegate.window?.makeKeyAndVisible()
}

二、iOS 12及以下(使用AppDelegate)

  1. 同样给登录页、主界面设置对应Storyboard ID。
  2. 打开AppDelegate.swift,修改application(_:didFinishLaunchingWithOptions:)方法:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    window = UIWindow(frame: UIScreen.main.bounds)
    
    let isLoggedIn = UserDefaults.standard.bool(forKey: "hasLoggedIn")
    let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
    
    if isLoggedIn {
        window?.rootViewController = mainStoryboard.instantiateViewController(withIdentifier: "MainVC")
    } else {
        window?.rootViewController = mainStoryboard.instantiateViewController(withIdentifier: "LoginVC")
    }
    
    window?.makeKeyAndVisible()
    return true
}
  1. 登录成功后的切换代码:
UserDefaults.standard.set(true, forKey: "hasLoggedIn")
UserDefaults.standard.synchronize()

let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
let mainVC = mainStoryboard.instantiateViewController(withIdentifier: "MainVC")
UIApplication.shared.delegate?.window??.rootViewController = mainVC

注意事项

  • 确保故事板中每个控制器的Storyboard ID与代码中的标识符完全一致,且勾选了Is Initial View Controller的控制器可以取消勾选(因为我们通过代码指定根控制器)。
  • 若需要更安全的登录状态存储(比如用户Token),可以替换UserDefaults为Keychain,避免敏感数据泄露。

内容的提问来源于stack exchange,提问作者Cuvsie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:37:41