Ios 在UITABBARCONTROLLERDEGATE中获取当前活动的viewController

Ios 在UITABBARCONTROLLERDEGATE中获取当前活动的viewController,ios,swift,uiviewcontroller,uitabbarcontroller,Ios,Swift,Uiviewcontroller,Uitabbarcontroller,我想在我的UITabBarController中的所有viewcontroller上实现scrollToTop方法。以下是当我选择选项卡时,UITabBarControllerDelegate和触发器中的一个方法。 问题是,当viewController处于活动状态时,我只想滚动到viewController的顶部。因此,用户可以在不丢失滚动位置的情况下切换选项卡,但是当他触摸当前活动选项卡的选项卡栏中的选项卡时,它应该滚动到顶部 func tabBarController(_ tabBarCo

我想在我的
UITabBarController
中的所有
viewcontroller
上实现scrollToTop方法。以下是当我选择选项卡时,
UITabBarControllerDelegate
和触发器中的一个方法。 问题是,当
viewController
处于活动状态时,我只想滚动到
viewController
的顶部。因此,用户可以在不丢失滚动位置的情况下切换选项卡,但是当他触摸当前活动选项卡的选项卡栏中的选项卡时,它应该滚动到顶部

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    if viewControllerThatIsCurrentlyActiveInTabBar == viewController {
        scrollToTop()
    }
}
基本上,我需要上面if语句的条件。
我尝试了:
viewController.isViewLoaded
tabBarController.selectedViewController==viewController
viewController.isBeingPresented
。这些条件都不起作用。它要么不会触发
scrollToTop()
,要么总是会触发,这样您在更改选项卡时会丢失滚动位置,因为它会立即滚动到顶部。

您需要在“应选择”而不是“按选择”中生成代码。因为选择后无法找到上一个控制器。下面是它的示例代码

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    if viewControllerThatIsCurrentlyActiveInTabBar == viewController {
        scrollToTop()
    }
}
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    if tabBarController.selectedViewController == viewController {
        print("Same viewcontroller")
    }
    return true
}

您需要在should select而不是didselect中生成代码。因为选择后无法找到上一个控制器。下面是它的示例代码

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    if tabBarController.selectedViewController == viewController {
        print("Same viewcontroller")
    }
    return true
}

您可以使用下面的扩展来获取tabbarcontroller的TopViewController

扩展UIViewController{

var top: UIViewController? {
    if let controller = self as? UINavigationController {
        return controller.topViewController?.top
    }
    if let controller = self as? UISplitViewController {
        return controller.viewControllers.last?.top
    }
    if let controller = self as? UITabBarController {
        return controller.selectedViewController?.top
    }
    if let controller = presentedViewController {
        return controller.top
    }
    return self
}
}

您可以在下面使用上面的扩展名

 if let rootViewController = UIApplication.top() {
    //do with Active view controller
}

您可以使用下面的扩展来获取tabbarcontroller的TopViewController

扩展UIViewController{

var top: UIViewController? {
    if let controller = self as? UINavigationController {
        return controller.topViewController?.top
    }
    if let controller = self as? UISplitViewController {
        return controller.viewControllers.last?.top
    }
    if let controller = self as? UITabBarController {
        return controller.selectedViewController?.top
    }
    if let controller = presentedViewController {
        return controller.top
    }
    return self
}
}

您可以在下面使用上面的扩展名

 if let rootViewController = UIApplication.top() {
    //do with Active view controller
}

好的,谢谢。你只需要返回true。好的,谢谢。你只需要返回true。