Swift 5 在标签切换前弹出所有控制器
Swift 5 pop all Controllers before tab switch
当我点击 tabor 项目时,我无法弹出所有控制器。我有以编程方式创建的标签栏控制器。我尝试做的是...用户接下来的方法:
extension TabbarViewController: UITabBarControllerDelegate{
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
self.navigationController?.popViewController(animated: false)
}
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: {
self.navigationController?.popViewController(animated: false)
})
}
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
self.navigationController?.popViewController(animated: false)
return true
}
}
AppDelegate 包含
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
let rootNavController = UINavigationController(rootViewController: TabbarViewController())
UIApplication.shared.keyWindow?.rootViewController = rootNavController
根据您的代码,您的选项卡栏控制器是导航控制器的根,因此 self.navigationController
将引用 that 导航控制器。这意味着行:
self.navigationController?.popViewController(animated: false)
将尝试从导航控制器中弹出标签栏控制器,但因为它是根,所以它什么都不做。
我假设您有导航控制器作为选项卡栏控制器的每个选项卡,并且您想将 那些 导航控制器弹出到它们的根目录,对吧?
您应该使用 viewController
参数来引用您想要的导航控制器:
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: {
(viewController as? UINavigationController)?.popToRootViewController(animated: false)
})
}
当我点击 tabor 项目时,我无法弹出所有控制器。我有以编程方式创建的标签栏控制器。我尝试做的是...用户接下来的方法:
extension TabbarViewController: UITabBarControllerDelegate{
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
self.navigationController?.popViewController(animated: false)
}
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: {
self.navigationController?.popViewController(animated: false)
})
}
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
self.navigationController?.popViewController(animated: false)
return true
}
}
AppDelegate 包含
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
let rootNavController = UINavigationController(rootViewController: TabbarViewController())
UIApplication.shared.keyWindow?.rootViewController = rootNavController
根据您的代码,您的选项卡栏控制器是导航控制器的根,因此 self.navigationController
将引用 that 导航控制器。这意味着行:
self.navigationController?.popViewController(animated: false)
将尝试从导航控制器中弹出标签栏控制器,但因为它是根,所以它什么都不做。
我假设您有导航控制器作为选项卡栏控制器的每个选项卡,并且您想将 那些 导航控制器弹出到它们的根目录,对吧?
您应该使用 viewController
参数来引用您想要的导航控制器:
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: {
(viewController as? UINavigationController)?.popToRootViewController(animated: false)
})
}