如何通过setViewControllers将Storyboard创建的UIViewController加入TabBarController
解决Storyboard控制器添加到TabBarController的运行时崩溃问题
核心问题分析
你遇到的EXC_BAD_ACCESS崩溃,大概率是因为homeTabBarController未被正确初始化——它可能是未赋值的可选变量,或指向了已释放的内存地址,导致调用setViewControllers时触发野指针访问。
修复步骤
- 确保TabBarController正确初始化
如果homeTabBarController是Storyboard创建的,需用instantiateViewController实例化;如果是纯代码创建,要用UITabBarController()初始化,不能直接使用未初始化的变量。 - 避免强制解包
强制解包!会在控制器实例化失败时直接崩溃,改用guard let或if let做安全校验。 - 规范设置TabBarItem
虽然不是崩溃直接原因,但给控制器设置tabBarItem能保证标签页显示正常,避免后续问题。
修正后的代码
func loadTabBar() { // 1. 实例化Storyboard中的HomeViewController let storyboard = UIStoryboard(name: "Main", bundle: nil) guard let homeViewController = storyboard.instantiateViewController(identifier: Constants.Storyboard.homeViewController) as? HomeViewController else { print("HomeViewController实例化失败") return } // 2. 设置标签页标题和图标(可选但推荐) homeViewController.title = "Home" homeViewController.tabBarItem = UITabBarItem(title: "Home", image: UIImage(systemName: "house"), selectedImage: UIImage(systemName: "house.fill")) // 3. 正确初始化TabBarController let homeTabBarController = UITabBarController() // 代码创建方式 // 如果是Storyboard中的TabBarController,替换成下面这行: // guard let homeTabBarController = storyboard.instantiateViewController(identifier: "HomeTabBarController") as? UITabBarController else { return } // 4. 设置标签页控制器并present homeTabBarController.setViewControllers([homeViewController], animated: false) homeTabBarController.modalPresentationStyle = .fullScreen present(homeTabBarController, animated: true) }
额外注意点
- 如果
homeTabBarController是全局变量,必须确保在调用setViewControllers前完成初始化,不能留空值。 - 检查Storyboard中
HomeViewController的Storyboard ID是否和Constants.Storyboard.homeViewController的取值完全一致,大小写也要匹配。
内容的提问来源于stack exchange,提问作者BiggRojo
相关产品推荐
相关产品推荐

