我有一个TabBarController,在storboard编辑器中设置了4个标签。当我选择第4个选项卡时,我想将一个字符串发送到它的视图控制器。在我的TabbarController类(名为TabBarVC)中,我实现了以下方法:
- (void)tabBarController:(UITabBarController *)theTabBarController didSelectViewController:(UIViewController *)viewController {
NSUInteger indexOfTab = [theTabBarController.viewControllers indexOfObject:viewController];
if(indexOfTab == 3) {
SupplierListVC *slvc = (SupplierListVC *) viewController;
slvc.locationType = @"favorite";
self.tabBarController.selectedViewController = slvc;
}
}
这个方法被调用得很好但字符串没有被传递。当我调试时,我注意到上面的代码是在SupplierListVC的viewDidLoad之后调用的。我在这做错了什么?当我选择标签时,如何传递字符串?
答案 0 :(得分:3)
正如您所说,此方法在viewDidLoad
之后调用。方法名称本身应该告诉您:**DID**SelectViewController
过去式。英语可能不是你的第一语言,但是在使用Apple的方法名称时,对英语动词时态的良好理解是非常,真实,真实,非常长的方式。他们并没有误导。它们只是在方法名称中告诉您该方法的确切时间/原因/原因。
现在,字符串应该被适当地传递给视图控制器 - 你可能只是在错误的时间检查它。
但是使用标签栏时,每次切换到标签时都不会加载它包含的视图控制器。标签预加载一次,如果标签栏控制器本身被关闭(或者可能从标签栏控制器的视图控制器阵列中删除视图控制器),则只会卸载标签。
您可以使用tabBarController:shouldSelectViewController:
此方法与您正在使用的方法类似,为您提供对标签栏控制器及其尝试切换的视图控制器的引用。但它返回BOOL
值。如果您返回NO
,则切换不会发生。如果需要,您可以随时返回YES
,但这里的要点是在切换开始之前调用此方法,因此肯定在viewWillAppear
和viewDidAppear
被调用之前。
答案 1 :(得分:0)
将数据从tabbar控制器传递给viewcontroller时,我遇到了同样的问题。
NumberpadViewController *numpad= [[self viewControllers] objectAtIndex:1];
numpad.number=@"12345";
我在viewdidload方法中将数字设为nil。
- (void)viewDidLoad {
NSLog(@"number@",number);//nil value
}
所以我使用了viewdidappear方法对数字数据进行处理。
-(void)viewDidAppear:(BOOL)animated{
NSLog(@"number@",number);//12345
}