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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:47:29