将数据传递给Tabbar控制器

我有一个故事板项目,我想从视图中传递一些数据到一个标签栏控制器,信息将分散在标签之间。 在做了一些研究之后,我发现了一个非常类似的问题: iOS故事板传递数据navigationViewController,但这个解决scheme的唯一问题是它没有传输到标签栏控制器。 我想知道我是否必须将数据传递给每个选项卡,或者我可以将它传递给标签栏控制器,然后从那里传播? 提前谢谢你的帮助!

我目前正在使用以下; 但是,我得到一个错误:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"FoodPage"]) { NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; UINavigationController *nav = [segue destinationViewController]; FoodViewController *destViewController = (FoodViewController*) nav.topViewController; destViewController.Foods = [foodArray objectAtIndex:indexPath.row]; } } 

为了在您的情况下获得对您的UINavigationController的引用,您必须执行以下操作并首先为您的tabBarController指定正确的索引:

 UINavigationController *nav = [self.tabBarController.viewControllers objectAtIndex:<THE_INDEX_NUMBER_FOR_YOUR_NAVIGATION_CONTROLLER]; 

一旦你这样做了,那么你通过在你的UINavigationController上再次指定它的索引号(例如,如果它在最上面,然后是0 )来检索对你的FoodViewController的引用:

 FoodViewController *destViewController = (FoodViewController*) [self.nav.viewControllers objectAtIndex:0]; 

更新

现在我有了一个更好的主意,你想实现什么:

您正在使用UITabbarController了其他控制器的UITabbarController

scheme/示例案例

假设我们有两个视图控制器,分别是控制器A和控制器B,都embedded在UITabbarController

我们想要什么:

我们正在尝试从控制器A中更改控制器B中的UILabel文本。

首先 ,在.h中声明控制器B中的一个property

 @property(strong, nonatomic) UILabel *aLabelInControllerB; 

其次 ,在你的控制者中声明一个财产(或伊娃)A:

 @property(strong, nonatomic) ControllerB *controllerB; 

既然你使用的是UITabbarController你不需要使用segue,你可以简单的通过self.tabBarController来获取UITabbarController ;

问题 :“当我的标签栏控制器被点击,然后改变控制器B中标签的文本,我怎么知道?

我们这样做:

设置控制器A作为UITabbarController的代表:

在控制器A .h中,添加:

 @interface <Your_Controller> : UIViewController <UITabBarControllerDelegate> 

在控制器A的viewDidLoad中:

 self.tabBarController.delegate = self; 

在控制器A.m中,实现这个方法:

 - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { self.controllerB = (ControllerB *) [tabBarController.viewControllers objectAtIndex:1]; //In our example here, we only have 2 view controllers (A and B) //So, index 1 is where controller B resides. self.controllerB.aLabelInControllerB.text = @"Hello!"; //This will change the text of the label in controller B } 

而作为控制器B出现,你会看到标签的文本将被改为“你好!

在控制器B中设置NSString遵循相同的程序。

例如: self.controllerB.stringInControllerB = @"Hi from controller B!";

希望有所帮助。



更新2:

从表格视图单元格到标签栏控制器? Oki ..这是解决scheme。 在我的例子中,我只使用一个单元格,所以如果希望将来有更多的单元格,我会留给你去调整。

我们来看看故事板布局:

在故事板中, 控制从单元格拖动到标签栏控制器。

像在图片中添加一个UINavigationController

在你的UITableViewController .m中:

添加2个属性:

 @property (strong, nonatomic) UITabBarController *myTabbarController; @property (strong, nonatomic) YourFirstViewController *myFirstViewController; 

只是一个善意的提醒:

请记住添加:

 self.tableView.delegate = self; self.tableView.dataSource = self; 

在表格视图控制器中添加以下内容:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { self.myTabbarController = (UITabBarController*) [segue destinationViewController]; self.myFirstViewController = [self.myTabbarController.viewControllers objectAtIndex:0]; self.myFirstViewController.stringFromTableViewController = @"Hi from TableViewController!"; } 

myFirstViewController ,在.h中添加2个属性:

 @property (strong, nonatomic) NSString *stringFromTableViewController; @property (strong, nonatomic) YourSecondViewController *secondViewController; 

就像上面的第二个编辑一样,让你的第一个视图控制器仍然是UITabBarControllerDelegate的委托并实现这个方法:

 - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { self.secondViewController = (YourSecondViewController*) viewController; self.secondViewController.aLabel.text = self.stringFromTableViewController; } 

就像以前一样,在SecondViewController什么都不需要改变。

我自己跑了 应该很好去你的设置。

请享用。

也可以从TabBar的子视图控制器本身的TabBar中访问数据,如下所示:

 MyTabbarViewController *tabbar = (MyTabbarViewController *)self.tabBarController; NSLog(@"%@", tabbar.data); 

这样,您只需要像上面所示的那样设置TabBar中的数据,然后在子视图中随时访问它。