Swift与Xcode中修改App默认入口点无效问题求助
问题分析与修复方案
为什么你的代码不生效?
window未初始化:你代码里的window?是可选变量,默认值为nil,导致window?.rootViewController和window?.makeKeyAndVisible()这两行因可选链调用失败,完全不会执行。- 缺少登录状态判断:当前代码每次启动都强制跳首页,不符合“登录后切换入口”的需求——你需要先判断用户是否已完成登录。
- iOS版本适配问题:如果你的项目是iOS 13及以上,窗口管理逻辑已迁移到
SceneDelegate,AppDelegate里的设置不会生效。
修复步骤
1. 先实现登录状态的持久化
在用户登录成功时,把登录状态存在UserDefaults里:
// 登录成功后执行 UserDefaults.standard.set(true, forKey: "isUserLoggedIn")
2. iOS 13+ 项目(使用SceneDelegate)
打开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 let mainStoryboard = UIStoryboard(name: "Main", bundle: nil) let initialViewController: UIViewController // 判断登录状态 let isLoggedIn = UserDefaults.standard.bool(forKey: "isUserLoggedIn") if isLoggedIn { // 安全转换首页控制器,避免强制解包崩溃 guard let homeVC = mainStoryboard.instantiateViewController(withIdentifier: "homePage") as? HomePageController else { // 转换失败时 fallback 到默认入口 initialViewController = mainStoryboard.instantiateInitialViewController()! return } initialViewController = homeVC } else { // 未登录时跳登录页,替换成你的登录控制器ID和类型 guard let loginVC = mainStoryboard.instantiateViewController(withIdentifier: "loginPage") as? LoginController else { initialViewController = mainStoryboard.instantiateInitialViewController()! return } initialViewController = loginVC } window.rootViewController = initialViewController window.makeKeyAndVisible() }
3. iOS 12及以下项目(仅用AppDelegate)
修改AppDelegate.swift中的代码,先初始化window:
var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 初始化窗口 window = UIWindow(frame: UIScreen.main.bounds) let mainStoryboard = UIStoryboard(name: "Main" , bundle: nil) let initialViewController: UIViewController // 判断登录状态 let isLoggedIn = UserDefaults.standard.bool(forKey: "isUserLoggedIn") if isLoggedIn { guard let homeVC = mainStoryboard.instantiateViewController(withIdentifier: "homePage") as? HomePageController else { initialViewController = mainStoryboard.instantiateInitialViewController()! return true } initialViewController = homeVC } else { guard let loginVC = mainStoryboard.instantiateViewController(withIdentifier: "loginPage") as? LoginController else { initialViewController = mainStoryboard.instantiateInitialViewController()! return true } initialViewController = loginVC } window?.rootViewController = initialViewController window?.makeKeyAndVisible() return true }
额外注意事项
- 确保首页和登录页的Storyboard ID与代码中的字符串完全一致(区分大小写),且已在Storyboard中正确设置。
- 避免使用
!强制类型转换,一旦控制器类型不匹配会直接崩溃,用guard let或if let做安全转换更稳妥。
内容的提问来源于stack exchange,提问作者Moemen Hussein
相关产品推荐
相关产品推荐

