iOS设置初始视图控制器黑屏,无法跳转至登录/引导页问题
我来帮你排查这个问题,看起来你的核心问题是AppDelegate里的页面跳转逻辑没生效,始终进入主屏幕,还有手动设置初始VC时的黑屏问题,咱们一步步来解决:
1. 首要问题:Window未正确初始化
你的代码里直接使用self.window?.rootViewController,但如果window是nil的话,这行代码根本不会执行,自然不会替换掉Storyboard默认的初始视图控制器。在iOS 13之前的项目结构中,需要手动初始化window:
修改didFinishLaunchingWithOptions的开头,先创建window实例:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { FirebaseApp.configure() // 手动初始化window,这是让跳转逻辑生效的关键! window = UIWindow(frame: UIScreen.main.bounds) window?.backgroundColor = .white // 加个背景色还能避免黑屏问题 let storyboard = UIStoryboard(name: "Main", bundle: nil) // ... 后续的跳转逻辑 self.window?.makeKeyAndVisible() return true }
2. 检查Storyboard视图控制器标识符的拼写
你的代码里用了"loginViewController"(小写的l),但如果Storyboard里这个VC的标识符是"LoginViewController"(类名的驼峰写法),就会导致实例化失败——initialViewController会变成nil,最终还是用Storyboard默认的初始VC。
请打开Main.storyboard,分别检查三个VC的Storyboard ID:
- WalkthroughViewController的ID要和代码里的
"WalkthroughViewController"完全一致 - LoginViewController的ID要和代码里的标识符完全匹配(建议统一改成驼峰写法
"LoginViewController",减少大小写错误概率) - MainTabBarViewController的ID要和
"homeTabBarController"完全匹配
3. 验证UserDefaults和Firebase Auth的状态
可以在跳转逻辑前加日志,确认当前状态是否符合预期,方便排查逻辑判断是否出错:
let isLoggedIn = Auth.auth().currentUser != nil let hasViewedWalkthrough = UserDefaults.standard.bool(forKey: "hasViewedWalkthrough") print("登录状态:\(isLoggedIn),是否看过引导页:\(hasViewedWalkthrough)")
运行App后查看控制台日志,比如第一次启动应该是登录状态:false,是否看过引导页:false,此时应该跳转到引导页。
4. 手动设置初始VC时的黑屏问题
如果手动在Storyboard设置初始VC后出现黑屏,大概率是因为你的AppDelegate代码里尝试设置rootViewController但失败(比如window未初始化),或者VC本身的布局约束有问题。可以先注释掉AppDelegate里的跳转逻辑,只保留Firebase配置,再手动设置初始VC,排查是不是VC的布局问题。
修改后的完整代码
import UIKit import Firebase @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { FirebaseApp.configure() // 初始化window window = UIWindow(frame: UIScreen.main.bounds) window?.backgroundColor = .white let storyboard = UIStoryboard(name: "Main", bundle: nil) // 打印状态日志,方便调试 let isLoggedIn = Auth.auth().currentUser != nil let hasViewedWalkthrough = UserDefaults.standard.bool(forKey: "hasViewedWalkthrough") print("登录状态:\(isLoggedIn),是否看过引导页:\(hasViewedWalkthrough)") var initialViewController: UIViewController? if !isLoggedIn && !hasViewedWalkthrough { initialViewController = storyboard.instantiateViewController(withIdentifier: "WalkthroughViewController") as? WalkthroughViewController } else if !isLoggedIn && hasViewedWalkthrough { // 统一标识符为驼峰写法,避免大小写错误 initialViewController = storyboard.instantiateViewController(withIdentifier: "LoginViewController") as? LoginViewController } else { initialViewController = storyboard.instantiateViewController(withIdentifier: "homeTabBarController") as? MainTabBarViewController } guard let vc = initialViewController else { print("⚠️ 初始化视图控制器失败,请检查Storyboard ID是否正确") // 初始化失败时, fallback到主屏幕 initialViewController = storyboard.instantiateViewController(withIdentifier: "homeTabBarController") } window?.rootViewController = initialViewController window?.makeKeyAndVisible() return true } }
内容的提问来源于stack exchange,提问作者BVB09

