【问题标题】:iPhone UITabbar item double-click pops controllersiPhone UITabbar 项目双击弹出控制器
【发布时间】:2010-11-05 07:25:03
【问题描述】:

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

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

【问题讨论】:

    标签: iphone uitabbarcontroller tabbar uitabbaritem


    【解决方案1】:

    您可能不应该阻止这种行为。这是一个标准的 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;
    }
    

    【讨论】:

    • 我也建议不要在没有非常好的理由的情况下阻止这种行为。当系统范围的快捷方式不可用时,用户会很生气。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 啊哈。起初我认为类别是你的朋友,也许我可以在 UIViewController 上安装一个并干预 popToRootViewControllerAnimated: 以提醒部队。但这需要子类化,不是吗。 (我尽量避免在 Cocoa 中进行子类化,但这可能不是可能的情况之一。)如果有一个较少熵负载的方法,我会全神贯注。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-30
        • 1970-01-01
        相关资源
        最近更新 更多