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。