将数据传递给Tabbar控制器

时间:2014-01-22 00:08:37

标签: ios objective-c uitabbarcontroller segue uistoryboardsegue

我有一个故事板项目,我想将一些数据从视图传递到标签栏控制器,信息将在标签之间展开。在做了一些研究之后,我发现了一个非常类似的问题:iOS storyboard passing data navigationViewController但是这个解决方案的唯一问题是它没有转移到标签栏控制器。我想知道我是否必须将数据传递给每个标签,还是可以将其传递给标签栏控制器然后从那里传播?感谢您的帮助!

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

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

2 个答案:

答案 0 :(得分:6)

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

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

完成此操作后,您可以通过再次指定FoodViewController上的索引编号来检索对UINavigationController的引用(即如果它位于顶部,则为0) :

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

<强> 更新

现在我已经更好地了解了您想要实现的目标:

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

场景/示例案例

假设我们分别有2个视图控制器,控制器A和控制器B,两者都嵌入在UITabbarController中。

我们想要什么:

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

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

@property(strong, nonatomic) UILabel *aLabelInControllerB;

第二个,在控制器A中声明一个属性(或ivar):

@property(strong, nonatomic) ControllerB *controllerB;

由于您使用的是UITabbarController,因此您可以简单地使用segue 通过UITabbarController;

抓住self.tabBarController

问题 :“当我的标签栏控制器被点击然后更改控制器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出现时,您将看到标签的文本将更改为“Hello!”

在控制器B中设置NSString遵循相同的步骤。

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

希望有所帮助。



更新2:

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

让我们来看看故事板布局:

在情节提要中, control 从您的单元格拖动到标签栏控制器。

在图片中添加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无需更改任何内容。

我自己跑了;应该很适合你的设置。

享受。

答案 1 :(得分:2)

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

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

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