将数据传递给Tabbar控制器

pau*_*590 6 objective-c uitabbarcontroller ios segue uistoryboardsegue

我有一个故事板项目,我想将一些数据从视图传递到标签栏控制器,信息将分布在选项卡之间.在做了一些研究后,我发现了一个非常类似的问题:iOS故事板传递数据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];
  }
}
Run Code Online (Sandbox Code Playgroud)

Unh*_*lig 6

为了UINavigationController在您的案例中获得对您的引用,您必须执行以下操作并为您的tabBarController 第一个指定正确的索引:

UINavigationController *nav = [self.tabBarController.viewControllers objectAtIndex:<THE_INDEX_NUMBER_FOR_YOUR_NAVIGATION_CONTROLLER];
Run Code Online (Sandbox Code Playgroud)

一旦你这样做了,你就可以FoodViewController通过再次指定它的索引号来检索你的引用UINavigationController(例如,如果它在顶部,那么0):

FoodViewController *destViewController = (FoodViewController*) [self.nav.viewControllers objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

更新:

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

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

场景/示例案例:

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

我们想要什么:

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

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

@property(strong, nonatomic) UILabel *aLabelInControllerB;
Run Code Online (Sandbox Code Playgroud)

其次,在你的控制器A中声明一个属性(或ivar):

@property(strong, nonatomic) ControllerB *controllerB;
Run Code Online (Sandbox Code Playgroud)

既然你正在使用UITabbarController你不需要使用segue,你可以简单地获得一个UITabbarController通道self.tabBarController;

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

我们这样做:

将控制器A设置为以下代表UITabbarController:

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

@interface <Your_Controller> : UIViewController <UITabBarControllerDelegate>
Run Code Online (Sandbox Code Playgroud)

viewDidLoad控制器A中:

self.tabBarController.delegate = self;
Run Code Online (Sandbox Code Playgroud)

在控制器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
}
Run Code Online (Sandbox Code Playgroud)

当控制器B出现时,您将看到标签的文本将更改为"Hello!"

NSString在控制器B中设置a 遵循相同的过程.

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

希望有所帮助.



更新2:

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

我们来看看故事板布局:

在故事板中,control从单元格拖动到选项卡栏控制器.

UINavigationController在图片中添加一个类似的东西.

在你的UITableViewController.m:

添加2个属性:

@property (strong, nonatomic) UITabBarController *myTabbarController;
@property (strong, nonatomic) YourFirstViewController *myFirstViewController;
Run Code Online (Sandbox Code Playgroud)

只是一个善意的提醒:

记得添加:

self.tableView.delegate = self;
self.tableView.dataSource = self;
Run Code Online (Sandbox Code Playgroud)

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

- (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!";
}
Run Code Online (Sandbox Code Playgroud)

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

@property (strong, nonatomic) NSString *stringFromTableViewController;
@property (strong, nonatomic) YourSecondViewController *secondViewController;
Run Code Online (Sandbox Code Playgroud)

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

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

就像以前一样,没有什么需要改变的SecondViewController.

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

请享用.