我在iOS5中使用xcode中的Storyboard。我有一个带有6个选项卡的TabBarController。在TabController之前,用户选择一种帐户A oR B,如果选择了类型B,我想隐藏其中一个标签。
我有一个UITabBarController的子类,这段代码可以工作,但它不是我想要的。
if (accountType == 2) {
[[[[self tabBar] items] objectAtIndex:1] setEnabled:NO];
}
这使我的第二个标签变暗并且无法使用,这是可以的,但我真的希望这个工作......
[[[[self tabBar] items] objectAtIndex:1] setHidden:YES];
但它导致此错误: - [UITabBarItem setHidden:]:无法识别的选择器发送到实例0x856f490 * 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [UITabBarItem setHidden:]:无法识别的选择器发送到实例0x856f490'
还有另一种方法可以达到这个目的吗?
答案 0 :(得分:1)
为什么不等待tabBar viewControllers的初始化,直到您知道用户选择哪种类型的帐户?为此,请使用setViewControllers:animated:
方法,例如如下:
if (accountType == 1) {
NSArray* controllersForTabBar = [NSArray arrayWithObjects:myVC1,myVC2,myVC3,myVC4,myVC5,myVC6 nil];
[[[self tabBar] setViewControllers:controllersForTabBar] animated:YES];
}
if (accountType == 2) {
NSArray* controllersForTabBar = [NSArray arrayWithObjects:myVC1,myVC2,myVC3,myVC4,myVC5, nil];
[[[self tabBar] setViewControllers:controllersForTabBar] animated:YES];
}
这种方法的苹果文档说:
分配一组新的视图控制器运行时,选项卡栏 controller在安装之前删除所有旧视图控制器 新的。更改视图控制器时,标签栏 controller会记住以前的视图控制器对象 选择并尝试重新选择它。如果选择了视图控制器 它不再存在,它会尝试选择视图控制器 数组中的索引与上一个选择相同。如果该索引是 无效,它选择索引0处的视图控制器。
关于您的错误消息:您收到该错误,因为tabBar未实现方法setHidden:
。
答案 1 :(得分:1)
d.ennis回答指出了我正确的方向。必须使用Storyboard稍微调整一下ios5 ...
// load the storyboard by name
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
if (accountType == 1) {
UIViewController *fvc = [storyboard instantiateViewControllerWithIdentifier:@"First"];
UIViewController *svc = [storyboard instantiateViewControllerWithIdentifier:@"Second"];
} else {
UIViewController *fvc = [storyboard instantiateViewControllerWithIdentifier:@"First"];
UIViewController *svc = [storyboard instantiateViewControllerWithIdentifier:@"Second"];
UIViewController *tvc = [storyboard instantiateViewControllerWithIdentifier:@"Third"];
}
tabBarController = [[UITabBarController alloc] init];
tabBarController.delegate = self;
NSArray *controllersForTabBar = [NSArray arrayWithObjects: fvc, svc, nil];
[tabBarController setViewControllers:controllersForTabBar animated:NO];
[self.view addSubview:tabBarController.view];