【问题标题】:Get another tab's viewcontroller variable in current tab bar - iOS - Swift在当前标签栏中获取另一个标签的 viewcontroller 变量 - iOS - Swift
【发布时间】:2025-12-11 09:45:01
【问题描述】:

我有一个 tabBarController 具有以下层次结构

标签栏控制器

  • Tab 1 -> 包含导航控制器 (NavController1) -> ViewController1 -has--> ContainerView --contains--> DisplayedViewControllerTab1(这是我的 tab1 视图控制器显示)

变量 dataForVC1 在 DisplayedViewControllerTab1 中

  • 当用户点击 Tab3 (DisplayedViewControllerTab3) 时,我试图将 dataForVC1 的值传递给 tab3 viewController

到目前为止,我已经尝试过了

在 TabBarController - didSelect 方法中

    var data: ModelData?  
    if let navController = tabBarController.viewControllers?[0] as? NavController1, 
       let childNavVC = navController.children.first as? ViewController1 {
       //Get container view
       let conView = childNavVC.containerView. //This is outlet

      //Looking for something like this - struck here
      if let displayedVC1 = "Container view's VC as? DisplayedViewControllerTab1 {
         data = displayedVC1.dataForVC1
     }
}

请告知如何实现这一目标

【问题讨论】:

    标签: ios swift uiviewcontroller uitabbarcontroller uicontainerview


    【解决方案1】:

    您无需忙于使用容器视图。在您的ViewController1 中,只需添加对 DisplayedViewControllerTab1 或您需要的其他 vc 的引用,然后直接访问它们。

    你的 VC 代码看起来像这样。

    class ViewController1: UIViewController {
       //...
       var displayedVC1: DisplayedViewControllerTab1?
       //...
    }
    
    

    然后是你的代码:

    var data: ModelData?  
    if let navController = tabBarController.viewControllers?[0] as? NavController1, 
       let childNavVC = navController.children.first as? ViewController1 {
         data = childNavVC.displayedVc1
    }
    

    附:为方便起见,如果您有自己的 TabBarController 类,则可以在创建控制器时添加所需的所有引用,或者只是具有计算属性,因此您无需一直深入层次结构。

    在您的TabbarViewController 班级中:

    var myViewController1: MyViewControllerOne? {
       return (viewControllers[0] as? NavController)?.children.first as? MyViewControllerOne
    }
    var myViewController2: MyViewControllerTwo? {
       return (viewControllers[1] as? NavController)?.children.first as? MyViewControllerTwo
    }
    

    【讨论】:

    • 我已经从容器转移到 DisplayedViewControllerTab1。如果我添加这个“var displayVC1: DisplayedViewControllerTab1?” 那么我的displayedVC1 将为零,直到我分配一些值
    • 是的,但没关系?在那之前你也没有导航数据,所以我看不出这可能是个问题。