Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何将数据从选项卡栏控制器传递到其选项卡之一?_Iphone_Objective C_Uiviewcontroller_Uitabbarcontroller_Storyboard - Fatal编程技术网

Iphone 如何将数据从选项卡栏控制器传递到其选项卡之一?

Iphone 如何将数据从选项卡栏控制器传递到其选项卡之一?,iphone,objective-c,uiviewcontroller,uitabbarcontroller,storyboard,Iphone,Objective C,Uiviewcontroller,Uitabbarcontroller,Storyboard,我在情节提要中设置了一个UITabBarController。我想从选项卡栏控制器传递一个数据字典,以便在相应的子选项卡(标准UIViewController)中使用 let viewControllers = self.tabBarController?.viewControllers let navController = viewControllers![0] as! UINavigationController let profileViewController = self.sto

我在情节提要中设置了一个UITabBarController。我想从选项卡栏控制器传递一个数据字典,以便在相应的子选项卡(标准UIViewController)中使用

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
这似乎是一个很长的问题要回答,但我真的不知道从哪里开始。我在寻找最简单的方法。我必须使选项卡以编程方式工作吗?如果能为我提供任何有用的开发人员文档,我将不胜感激

-奥斯汀

p、 我是新来的,到目前为止,我的viewcontroller转换依赖于情节提要

您最好的选择是使用通知

在选项卡栏中,可以执行以下操作:

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方法中,我可以使用

    [[self viewControllers] objectAtIndex:0]
或者您希望访问的任何索引

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

让它工作了

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

如果将
UINavigationController
作为
uitabarcontroller
视图控制器之一,则可以执行以下操作:

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];

使用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

使用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
        }
}

我很难解析这个。如何将数据存储在UITabBarController中?您是否正在子类化UITabBarController?选项卡栏控制器实际上只是用于控制视图控制器的元控制器。在苹果的MVC框架中,应该使用视图控制器将模型数据绑定到视图。如果您需要以复杂的方式在视图控制器之间共享数据,那么您可以使用通知、创建单例、将数据存储在应用程序代理中,或者使用CoreData之类的共享外部存储。Jeff,具体来说,我将数据传递给UITabBarController,但是,我不知道如何将数据分发到单独的选项卡式视图控制器。我很难让它正常工作。我已经尝试将tabBarController代码放入其viewDidLoad和tabBarController:didSelectViewController中,但都没有成功。我把子代码放在它的viewDidLoad中[self.viewVoControllers firstObject]更安全。想不到一个更简单的解决方案。黄金!!这涵盖了有关的解决方案,并讨论了5个以上选项卡可能出现的问题。