iPhone UITabbar项目双击弹出控制器。

5

刚刚发现一个情况:如果你的 Tabbar 与带有一些视图堆栈的 NavigationController 结合使用,并且你双击 TabBarItem,那么无论你喜不喜欢,该视图都会弹出到第一个 ViewController。

有没有办法防止这种情况发生呢?

4个回答

4
您可能不应该阻止这种行为。这是标准的iPhone用户界面约定,就像点击状态栏以滚动到滚动视图顶部一样。
如果您真的想这样做,您应该实现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;
}

1
我还建议不要没有非常好的理由就阻止这种行为。如果系统范围的快捷方式不可用,用户会感到恼火。 - user120587

1
我刚遇到这个问题,并找到了解决办法。为你的UITabBarController创建一个委托(delegate),并实现tabBarController:shouldSelectViewController:方法来防止选择相同的控制器:
- (BOOL) tabBarController:(UITabBarController *)tbc shouldSelectViewController:(UIViewController *)vc {
  return tbc.selectedViewController != vc;
}

如果您只想在某些情况下防止它,也可以添加更复杂的逻辑。


0
到目前为止,我找到的唯一方法是创建一个UINavigationController的子类,并覆盖popToRootViewControllerAnimated方法以返回nil。
这似乎是UITabBar在两次点击选项卡时调用的方法。我不知道这是否是正确的方法...很想听听对此问题的反馈...
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated {
    return nil;
}

0

我同意保持这种预期的行为,但同时在优雅地解开VC堆栈时(例如编辑嵌套的Core Data对象系列),事情变得有趣。在我的情况下,这等同于取消每个VC。

因此,有没有办法让我知道我们弹出到根VC?我想在viewWillDisappear期间进行取消/回滚操作并不够,因为在保存后,同一视图肯定也会消失。当在给定选项卡中弹出到根VC时,我需要以某种方式广播“我们正在取消-退出!”。在viewWillDisappear中检查脏/新标志作为安全检查也没有帮助,因为在实际取消的情况下(即如果实际点击了取消按钮),该测试将被调用两次。


啊哈。起初我认为类别是你的朋友,也许我可以在UIViewController上搞一个,并在popToRootViewControllerAnimated:中干预以警告部队。但这将需要子类化,不是吗。(每当可能时,我尽量避免在Cocoa中进行子类化,但这可能不是其中之一。)如果有一种更少熵的方法来解决这个问题,我全听着。 - Joe D'Andrea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接