【问题标题】:How do I pass data from a tab bar controller to one of its tabs?如何将数据从选项卡栏控制器传递到其选项卡之一?
【发布时间】:2012-05-26 12:55:10
【问题描述】:

我在情节提要中设置了一个 UITabBarController。我想从标签栏控制器传递一个数据字典,以便在适当的子标签中使用,这是一个标准的 UIViewController。

这似乎是一个很长的问题要回答,但我真的不知道从哪里开始。我正在寻找最简单的方法。我必须以编程方式使选项卡起作用吗?向我指出任何有用的开发人员文档也将不胜感激。

-奥斯汀
p.s.我是新手,到目前为止,我一直依赖故事板进行视图控制器转换

【问题讨论】:

  • 我无法解析这个。你如何在 UITabBarController 中存储数据?你是 UITabBarController 的子类吗?标签栏控制器实际上只是一个用于控制视图控制器的元控制器。在 Apple 的 MVC 框架中,应该使用视图控制器将模型数据绑定到视图。如果您需要以复杂的方式在视图控制器之间共享数据,那么您可以使用通知、创建单例、将数据存储在应用程序委托中或使用共享的外部存储(如 CoreData)。
  • Jeff,所以具体一点,我将数据传递给 UITabBarController,但是我不明白如何将数据分发到单独的选项卡式视图控制器

标签: iphone objective-c uiviewcontroller uitabbarcontroller storyboard


【解决方案1】:

使用 Swift

if let navController = self.tabBarController?.viewControllers?[1] as? UINavigationController{
        if let testController = navController.childViewControllers.first as? MyViewController{
            testController.data = data
            self.tabBarController?.selectedIndex = 1
        }
}

【讨论】:

    【解决方案2】:

    使用 Swift

    如果您将UINavigationController 作为UITabBarController 中的选项卡之一,您希望获取子视图控制器的实例而不是创建新实例并将其推送到导航视图控制器,然后再更改选项卡视图索引.你可以这样做...

    此示例代码假定导航控制器位于第一个选项卡(索引 0)并且“childViewController”嵌入在导航控制器中。

    let viewControllers = self.tabBarController?.viewControllers
    
    let navController = viewControllers![0] as! UINavigationController
    
    let profileViewController = self.storyboard?.instantiateViewControllerWithIdentifier("childViewController") as? ProfileViewController
    
    profileViewController!.parameter1 = "Value1"
    
    profileViewController!.parameter2 = "Value2"
    
    navController.pushViewController(profileViewController!, animated: true)
    
    self.tabBarController?.selectedIndex = 0
    

    【讨论】:

      【解决方案3】:

      搞定了……

      我有 3 个视图控制器,我必须将数组从一个传递到另一个..

      这就是我所做的

      将数据附加到选项卡视图控制器之一

      NSArray *viewControllers = [self.tabBarController viewControllers];
          ListViewController *listView = (ListViewController *)viewControllers[1];
          listView.myArray = self.myArray;
          [self.tabBarController setSelectedIndex:1];
      

      然后,加载视图控制器,就是这样

      UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
      ListViewController *listView = (ListViewController *)[storyboard instantiateViewControllerWithIdentifier:@"IDListView"];
      

      【讨论】:

        【解决方案4】:

        如果您有一个 UINavigationController 作为您的 UITabBarController 视图控制器之一,您可以执行以下操作:

        NSArray *viewControllers = [self.tabBarController viewControllers];
        UINavigationController *myNavController = (UINavigationController *)viewControllers[2];
        MyViewController *myController = [[myNavController childViewControllers] firstObject];
        // Remember to alloc/init objects first if the objects haven't been initialized already.
        [myController.whateverArray = [[NSArray alloc] initWithArray:@[@"Example1", @"Example2"]];
        [self.tabBarController setSelectedIndex:2];
        

        【讨论】:

          【解决方案5】:

          花了几天时间,但我发现了一个简单的解决方案。在我的 TabBarController 的 viewDidLoad 方法中,我可以使用

          访问和设置选项卡式子视图的属性
              [[self viewControllers] objectAtIndex:0]
          

          或您希望访问的任何索引。

          将它保存为我的 tab1_viewController 的实例会给我一个指向该对象的指针,我可以从中获取和设置我的属性值。这最初是不清楚的,因为故事板为我创建了 tab_viewController 对象。我从来没有机会按照我想要的方式初始化它们!

          【讨论】:

          • [self.viewVonrollers firstObject] 更安全。
          • 想不到更简单的解决方案。金子!!这涵盖了有关超过 5 个选项卡的解决方案并讨论了可能存在的问题。 makeapppie.com/2015/02/04/…
          【解决方案6】:

          最好的办法是使用通知。

          在您的标签栏中,您可以这样做:

          NSDictionary *myDictionary; // Populate this with your data.
          
          // Fire the notification along with your NSDictionary object.
          [[NSNotificationCenter defaultCenter] postNotificationName:@"Some_Notification_Name" 
                                                              object:myDictionary];        
          

          然后在您的子标签 ViewController 中,您将“收听”该通知。

          [[NSNotificationCenter defaultCenter] addObserver:self 
                                                   selector:@selector(handleNotification:) 
                                                       name:@"Some_Notification_Name" 
                                                     object:nil];
          
          - (void)handleNotification:(id)object {
            // Use your NSDictionary object here.
          }
          

          【讨论】:

          • 我无法让它工作。我已经尝试将 tabBarController 代码放在它的 viewDidLoad 和它的 tabBarController:didSelectViewController 中,但都没有成功。我把子代码放在它的 viewDidLoad
          猜你喜欢
          • 2018-06-08
          • 1970-01-01
          • 1970-01-01
          • 2015-02-12
          • 1970-01-01
          • 1970-01-01
          • 2016-10-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多