Swift:无需Storyboard标识符,从登录页导航至代码创建的TabBar页面
问题:无Storyboard配置TabBar时,从登录页导航到旅行列表页的实现方式
已移除Storyboard中的TabBar,完全通过代码创建TabBar。现需实现:不依赖Storyboard标识符,从登录屏幕导航到旅行列表屏幕(旅行列表位于代码创建的TabBar的某个标签页中)。
旧代码(依赖Storyboard标识符):
func goToNextScreen() { performSegue(withIdentifier: "GoToTravelListScreen", sender: userLoged) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "GoToTravelListScreen" { let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main) let listTravelVC = storyboard.instantiateViewController(withIdentifier: "mainTabBar") as! UITabBarController listTravelVC.modalPresentationStyle = .fullScreen self.present(listTravelVC, animated: true, completion: { let navController = listTravelVC.viewControllers![0] as! UINavigationController let vc = navController.topViewController as! TravelListViewController vc.userLoged = self.userLoged }) } }
解决方案
1. 先实现纯代码版的TabBarController
定义自定义UITabBarController子类,在其中通过代码组装所有标签页的视图控制器,包括旅行列表所在的导航控制器:
class CustomTabBarController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() // 创建旅行列表控制器并包装进导航控制器 let travelListVC = TravelListViewController() let travelNav = UINavigationController(rootViewController: travelListVC) travelNav.tabBarItem = UITabBarItem(title: "旅行列表", image: UIImage(systemName: "list.bullet"), tag: 0) // 可添加其他标签页示例 let profileVC = UIViewController() let profileNav = UINavigationController(rootViewController: profileVC) profileNav.tabBarItem = UITabBarItem(title: "我的", image: UIImage(systemName: "person"), tag: 1) // 设置TabBar的子控制器数组 self.viewControllers = [travelNav, profileNav] } }
2. 修改登录页的导航逻辑
去掉performSegue和所有Storyboard相关代码,直接实例化自定义TabBarController并完成参数传递:
func goToNextScreen() { // 实例化纯代码创建的TabBar控制器 let tabBarVC = CustomTabBarController() tabBarVC.modalPresentationStyle = .fullScreen // 直接获取旅行列表控制器并传递用户数据 if let travelNav = tabBarVC.viewControllers?.first as? UINavigationController, let travelListVC = travelNav.topViewController as? TravelListViewController { travelListVC.userLoged = self.userLoged } // 跳转至TabBar页面 self.present(tabBarVC, animated: true) }
核心要点
- 彻底脱离Storyboard:所有视图控制器均通过代码初始化,无需在Storyboard中配置标识符或segue。
- 参数传递更安全:在present前即可获取目标控制器并设置参数,避免闭包内强制解包的潜在风险。
内容的提问来源于stack exchange,提问作者Boguhe Stephane
相关产品推荐
相关产品推荐

