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

Swift与Xcode中修改App默认入口点无效问题求助

问题分析与修复方案

为什么你的代码不生效?

  1. window未初始化:你代码里的window?是可选变量,默认值为nil,导致window?.rootViewController和window?.makeKeyAndVisible()这两行因可选链调用失败,完全不会执行。
  2. 缺少登录状态判断:当前代码每次启动都强制跳首页,不符合“登录后切换入口”的需求——你需要先判断用户是否已完成登录。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:01:43