iPhone UITabbar项目双击弹出控制器

时间:2009-06-23 19:56:24

标签: iphone uitabbarcontroller tabbar uitabbaritem

刚刚找到了一些东西:如果你有一个Tabbar与一个NavigationController结合(它的堆栈上有一些视图),你双击TabBarItem,视图弹出到第一个ViewController,无论你喜欢与否。

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

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

这似乎是UITabBar在选项卡两次时调用的方法。我不知道这是不是正确的方法......会喜欢这个问题的反馈......

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated {
    return nil;
}

答案 3 :(得分:0)

我同意保持这个预期的行为,但同时优雅地展开VC堆栈(例如编辑嵌套的Core Data对象系列时)。就我而言,这等于取消每个VC。

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