Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当第一个触发popToRootViewController时,检测选项卡栏项目上的第二次点击_Ios_Swift_Uikit_Uitabbarcontroller - Fatal编程技术网

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

Ios 当第一个触发popToRootViewController时,检测选项卡栏项目上的第二次点击,ios,swift,uikit,uitabbarcontroller,Ios,Swift,Uikit,Uitabbarcontroller,我想在用户点击选项卡栏中的选项卡栏项目时实现滚动到视图控制器顶部。我通过重写UITabBarController中的tabBarController(\utabbarcontroller:UITabBarController,应该选择viewController:UIViewController)->Bool方法来实现 func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController

我想在用户点击选项卡栏中的选项卡栏项目时实现滚动到视图控制器顶部。我通过重写
UITabBarController中的
tabBarController(\utabbarcontroller:UITabBarController,应该选择viewController:UIViewController)->Bool
方法来实现

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
}
每个选项卡都有导航控制器作为其视图控制器,点击选项卡栏会弹出到根视图控制器。这很好,也很理想,但我希望双击工作,即用户在导航控制器的第二个(或更高版本)视图中,双击选项卡栏,然后导航控制器弹出,根视图控制器滚动到顶部(第一个点击弹出到根视图控制器,第二个滚动到顶部)

不幸的是,当这种情况发生时,这个委托方法只被调用一次。只有在pop转换结束后,它才会开始检测选项卡栏项目上的下一次点击。 切换选项卡时,双击可以正常工作,即用户在选项卡B上,双击选项卡A,然后第一次点击切换到选项卡A,第二次点击滚动使其滚动到顶部

我查看了Facebook和Twitter的应用程序,它们都能正确处理快速双击——它们会弹出然后滚动到顶部


在进行pop转换时,是否有方法检测选项卡栏项目点击?我尝试重写
UITabBarController
tabBar(tabBar:UITabBar,didSelect item:UITabBarItem)
,但在上述场景中,双击也不会调用它两次。添加自定义双击识别器也没有帮助,因为它会显著延迟对选项卡栏的单次点击,这会导致应用程序看起来很滞后。

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

extension Notification.Name {
    static var userDoubleTapTabbar: Notification.Name {
       return .init(rawValue: "User.DoubleTapTabbar")
    }
} 
然后,在Tabbar控制器中,检测用户双击项目事件和火灾通知:

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
}
然后,在选项卡栏项目视图控制器中,可以为该通知添加观察者和处理程序,以将表视图滚动到顶部。可以使用此选项检查选项卡栏项目视图控制器当前是否可见:

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

希望对我的英语不好有所帮助,并表示歉意。

在视图中将出现,您可以滚动到top@PrashantTukadiya这不是一个选择。这将导致每次选项卡更改或当用户在导航控制器中弹出视图控制器时滚动到顶部,这不是我想要实现的。您可以在
选项卡栏上添加手势识别器
您尝试过吗?正如我在问题中所写的,是的,我尝试过。