6

刚刚发现了一些东西:如果您有一个 Tabbar 与 NavigationController 组合(在它的堆栈上有一些视图)并且您双击 TabBarItem,无论您喜欢与否,视图都会弹出到第一个 ViewController。

有没有办法防止这种情况?

4

4 回答 4

5

您可能不应该阻止这种行为。这是一个标准的 iPhone UI 惯例,就像点击状态栏滚动到滚动视图的顶部一样。

如果你真的想这样做,你应该实现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;
}
于 2010-03-22T08:07:20.300 回答
1

我自己也遇到了这个问题,并找到了解决方法。为您的 UITabBarController 创建一个委托并实施tabBarController:shouldSelectViewController:以防止选择相同的控制器:

- (BOOL) tabBarController:(UITabBarController *)tbc shouldSelectViewController:(UIViewController *)vc {
  return tbc.selectedViewController != vc;
}

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

于 2010-01-22T22:38:53.163 回答
0

到目前为止,我发现的唯一方法是创建 UINavigationController 的子类并覆盖 popToRootViewControllerAnimated 方法以返回 nil。

这似乎是两次选项卡时 UITabBar 调用的方法。我不知道这是否是正确的方法......希望对这个问题有一些反馈......

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated {
    return nil;
}
于 2009-07-27T10:57:41.090 回答
0

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

因此,有什么方法可以让我知道我们一直在弹出到根 VC?我认为 viewWillDisappear 期间的取消/回滚操作不会削减它,因为相同的视图在保存后肯定也会消失。我需要以某种方式广播“我们正在取消 - 纾困!” 在给定选项卡中一直弹出到根 VC 时。在 viewWillDisappear 中检查脏/新标志作为安全检查也无济于事,因为在合法取消的情况下(即,如果实际点击取消按钮),该测试将被调用两次。

于 2010-05-10T15:17:14.290 回答