检查特定的UIViewController是否在TabBarItems中

时间:2014-02-01 17:40:20

标签: ios uitabbarcontroller

使用UITabBarController如果用户已登录,我正尝试以编程方式添加或删除某些ViewControllers作为选项卡。

我使用以下代码添加ViewController'SecondViewController':

[newTabs addObject:second];
[self.tabBarController setViewControllers:newTabs];

并且,我运行下面的代码来检查特定的ViewController(第二个)是否在数组中。但它不起作用:vs永远不会等于秒。

NSMutableArray *newTabs = [NSMutableArray arrayWithArray:self.tabBarController.viewControllers];
BOOL found = FALSE;
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *second = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
for (UIViewController *vc in newTabs){
    if([vc isEqual: second]){
        found=TRUE;
    }
}

当我做NSLog时,这是响应:

2014-02-01 18:38:18.755 App Login Test[1469:11303] PostData: <SecondViewController: 0x71a2830>
2014-02-01 18:38:18.756 App Login Test[1469:11303] PostData: <SecondViewController: 0x75bcd90>

(这是我运行vc的NSLog和第二个,比较两者,并理解为什么它们不相等。)

我一直在寻找一段时间,但我无法找到解释!找到应该设置为TRUE,但它永远不会发生。

2 个答案:

答案 0 :(得分:1)

UIViewController isEqual:的实现只是检查内存地址。因此,两个不同的实例将不相等。

一种解决方案是检查对象的类型。

for (UIViewController *vc in newTabs){
    if ([vc isKindOfClass:[SecondViewController class]]){
        found=TRUE;
    }
}

答案 1 :(得分:0)

以下一行 [storyboard instantiateViewControllerWithIdentifier:@“SecondViewController”]; 将生成SecondViewController的新实例。

还根据Apple文档确认 “每次调用它时,此方法都会创建指定视图控制器的新实例。”

因此,您对isEqual的比较不一定有效。相反,你可以做这样的事情: ... if([vc isKindOfClass:[second class]]){ ....

一个可能更好的方法来实现你想要实现的目的是存储对SecondViewController的引用,而不是每次都实例化一个新的SecondViewController。然后你可以使用isEqual:来检查视图控制器是否已经在UITabBarController中,并添加你已经拥有的实例(如果它不存在)。