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)
    })
}