22

我有一个在故事板中设置的UITabBarController。我想从标签栏控制器传递一个数据字典,用于相应的子标签页,这是一个标准的UIViewController。如何将数据从标签栏控制器传递到其标签之一?

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

-Austin
p.s.我是新的,迄今为止依赖于故事板的视图控制器转换

+0

我无法解析此。你如何在UITabBarController中存储数据?你在继承UITabBarController吗?标签栏控制器实际上只是一个用于控制视图控制器的元控制器。在Apple的MVC框架中,应该使用视图控制器将模型数据绑定到视图。如果您需要以复杂的方式在视图控制器之间共享数据,那么您可以使用通知,创建单例,将数据存储在应用程序委托中,或使用共享的外部存储(如CoreData)。 –

+0

杰夫,所以具体而言,我将数据传递给UITabBarController,但我不明白如何将数据分发到单独的选项卡式视图控制器 – austin

回答

19

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

[[self viewControllers] objectAtIndex:0] 

或任何索引要访问我的设置选项卡式子视图的属性。

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

+2

[self.viewVontrollers firstObject]中更安全。 – Adobels

+0

想不到更简单的解决方案。金!!这涵盖了解决方案并讨论了超过5个选项卡的可能问题。 http://makeapppie.com/2015/02/04/swift-swift-tutorials-passing-data-in-tab-bar-controllers/ – DogCoffee

3

你最好的选择是使用通知。

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

NSDictionary *myDictionary; // Populate this with your data. 

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

然后在你的孩子标签视图控制器,你会“监听”该通知。

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(handleNotification:) 
              name:@"Some_Notification_Name" 
              object:nil]; 

- (void)handleNotification:(id)object { 
    // Use your NSDictionary object here. 
} 
+0

我无法正常工作。我试着把tabBarController代码放在它的viewDidLoad和tabBarController:didSelectViewController中,两者都没有成功。我把子代码放在viewDidLoad – austin

0

得到这个工作...

我有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"]; 
3

如果你有一个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]; 
2

使用斯威夫特

如果你有UINavigationControllerUITabBarController一个选项卡,您希望获取子视图控制器的实例,而不是创建新实例,并在更改选项卡视图索引之前将其推送到导航视图控制器。您可以这样做...

此示例代码假定导航控制器位于第一个选项卡(索引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 
1

随着斯威夫特

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