如何将标签栏控制器中的数据传递到其中一个选项卡?

时间:2012-05-19 00:17:03

标签: iphone objective-c uiviewcontroller uitabbarcontroller storyboard

我在故事板中设置了一个UITabBarController。我想从选项卡栏控制器传递数据字典,以便在相应的子选项卡中使用,该选项卡是标准的UIViewController。

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

-Austin
附:我是新手,到目前为止依赖故事板进行视图控制器转换

6 个答案:

答案 0 :(得分:21)

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

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

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

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

答案 1 :(得分:4)

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

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

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.
}

答案 2 :(得分: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];

答案 3 :(得分:1)

使用Swift

如果UINavigationController中有UITabBarController作为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 中的一个选项卡,则需要获取子视图控制器的实例,而不是创建新实例并将其推送到导航视图控制器,然后再更改选项卡视图索引。你可以这样做......

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

try {
    text.forEach(this::write);
catch (UncheckedIOException ex) {
    ...
}

private void write(String line) throws UncheckedIOException {
    try {
        fw.write(line +"\n");
    } catch (IOException ex) {
        throw new UncheckedIOException(ex);
    }
});

答案 4 :(得分: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
        }
}

答案 5 :(得分: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"];