iOS5 setHidden UITabBarItem导致崩溃

时间:2012-06-11 21:12:46

标签: ios5 storyboard uitabbaritem

我在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'

还有另一种方法可以达到这个目的吗?

2 个答案:

答案 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];