如何让登录界面在主界面之前显示(iOS Swift开发)
实现启动屏后优先显示登录/注册页的方案
以下是基于UIKit(故事板)的两种实现方式,适配不同iOS版本:
一、iOS 13及以上(使用SceneDelegate)
- 给故事板中的登录/注册页、主界面分别设置Storyboard ID(比如登录页设为
LoginVC,主界面设为MainVC)。 - 打开
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() }
- 登录成功后更新状态并切换到主界面:
// 登录成功时执行 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)
- 同样给登录页、主界面设置对应Storyboard ID。
- 打开
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 }
- 登录成功后的切换代码:
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
相关产品推荐
相关产品推荐

