刚刚发现一个情况:如果你的 Tabbar 与带有一些视图堆栈的 NavigationController 结合使用,并且你双击 TabBarItem,那么无论你喜不喜欢,该视图都会弹出到第一个 ViewController。
有没有办法防止这种情况发生呢?
刚刚发现一个情况:如果你的 Tabbar 与带有一些视图堆栈的 NavigationController 结合使用,并且你双击 TabBarItem,那么无论你喜不喜欢,该视图都会弹出到第一个 ViewController。
有没有办法防止这种情况发生呢?
UITabBarController
委托方法-tabBarController:shouldSelectViewController:
,就像mckeed提到的那样。然而,如果您有超过五个标签,则selectedViewController
可能是在“更多”部分中的视图控制器,但vc
将是[UITabBarController moreNavigationController]
。这里是处理这种情况的实现:- (BOOL)tabBarController:(UITabBarController *)tbc shouldSelectViewController:(UIViewController *)vc {
UIViewController *selected = [tbc selectedViewController];
if ([selected isEqual:vc]) {
return NO;
}
if ([vc isEqual:[tbc moreNavigationController]] &&
[[tbc viewControllers] indexOfObject:selected] > 3) {
return NO;
}
return YES;
}
tabBarController:shouldSelectViewController:
方法来防止选择相同的控制器:- (BOOL) tabBarController:(UITabBarController *)tbc shouldSelectViewController:(UIViewController *)vc {
return tbc.selectedViewController != vc;
}
如果您只想在某些情况下防止它,也可以添加更复杂的逻辑。
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated {
return nil;
}
我同意保持这种预期的行为,但同时在优雅地解开VC堆栈时(例如编辑嵌套的Core Data对象系列),事情变得有趣。在我的情况下,这等同于取消每个VC。
因此,有没有办法让我知道我们弹出到根VC?我想在viewWillDisappear期间进行取消/回滚操作并不够,因为在保存后,同一视图肯定也会消失。当在给定选项卡中弹出到根VC时,我需要以某种方式广播“我们正在取消-退出!”。在viewWillDisappear中检查脏/新标志作为安全检查也没有帮助,因为在实际取消的情况下(即如果实际点击了取消按钮),该测试将被调用两次。