使用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,但它永远不会发生。
答案 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中,并添加你已经拥有的实例(如果它不存在)。