当第一个触发popToRootViewController时,检测第二次点击选项卡栏项

时间:2019-07-16 08:37:43

标签: ios swift uikit uitabbarcontroller

我想在用户点击选项卡栏上的选项卡栏项目时实现到视图控制器顶部的滚动。我通过重写tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool中的UITabBarControllerDelegate方法来做到这一点。

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    // Scroll to top only if we are already on given tab
    if viewControllers?.firstIndex(of: viewController) == selectedIndex {
        // Checks if root VC of navigation controller is currently shown and then scrolls it to top
        scrollToTop(at: selectedIndex)
    }

    return true
}

每个选项卡都有导航控制器作为其视图控制器,点击选项卡栏会弹出根视图控制器。很好,很理想,但是我想双击即可工作,即用户处于导航控制器的第二个(或更高版本)视图中,双击选项卡栏,然后弹出导航控制器,然后根视图控制器滚动到顶部(第一次点击弹出至根视图控制器,第二个滚动到顶部)。

不幸的是,在发生这种情况时,只能委派一次此委托方法。仅在弹出转换结束后,它才开始检测选项卡栏项目上的下一个拍子。 切换选项卡时,例如用户在选项卡B上,双击选项卡A,然后双击将其切换到选项卡A,第二个滚动使其滚动到顶部,双击可以很好地工作。

我检查了Facebook和Twitter应用程序,它们都正确处理了快速双击-它们弹出,然后滚动到顶部。

是否有一种方法可以在进行弹出过渡时检测选项卡栏项目的点击?我尝试覆盖tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem)中的UITabBarController,但在上述情况下双击时也未两次调用它。添加自定义的双击识别器也无济于事,因为它会大大延迟单击选项卡栏的单次单击,从而导致应用看上去很滞后。

1 个答案:

答案 0 :(得分:0)

在这种情况下,您可以尝试使用通知。 首先,为您的Notification.Name创建扩展名:

extension Notification.Name {
    static var userDoubleTapTabbar: Notification.Name {
       return .init(rawValue: "User.DoubleTapTabbar")
    }
} 

然后,在Tabbar Controller中,检测用户双击项目事件和火灾通知:

public var lastTabbarItem: UITabBarItem?
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    SEManager.shared.playSound(type: .tap_bottom_tap)
    if self.lastTabbarItem == item {
        NotificationCenter.default.post(name: .userDoubleTapTabbar, object: nil)
    }
    self.lastTabbarItem = item
}

然后在Tabbar项目视图控制器中,可以为该通知添加观察者和处理程序,以将表格视图滚动到顶部。您可以使用它来检查Tabbar项目视图控制器是否当前可见:

if viewController.viewIfLoaded?.window != nil {
   // viewController is visible
}

希望它能为我的英语不好带来帮助和抱歉。

相关问题