我有一个故事板项目,我想将一些数据从视图传递到标签栏控制器,信息将在标签之间展开。在做了一些研究之后,我发现了一个非常类似的问题: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];
}
}
答案 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中设置数据,然后在子视图中随时访问它。