弹出标签栏应用程序上的所有视图控制器

Posted

技术标签:

【中文标题】弹出标签栏应用程序上的所有视图控制器【英文标题】:Popping all View Controllers on Tab Bar App 【发布时间】:2013-01-15 17:50:25 【问题描述】:

我有一个标签栏应用,在应用的 5 个标签中的 4 个上有导航控制器。我的应用程序中有一个“重置应用程序”功能,可以清除所有数据等……我还希望将所有视图控制器弹出回其顶视图。我知道如何使用 popToRootViewControllerAnimated 为单个导航控制器弹出到根目录,但是是否可以弹出每个选项卡上的所有视图控制器?

【问题讨论】:

【参考方案1】:

如果数组中的控制器是 UINavigationController,则需要枚举 tabBarController 的 viewControllers 数组并弹出到根视图控制器-

for(UIViewController *viewController in tabBarController.viewControllers)

    if([viewController isKindOfClass:[UINavigationController class]])
       [(UINavigationController *)viewController popToRootViewControllerAnimated:NO];

【讨论】:

虽然我收到“开始/结束外观转换的不平衡调用”,但它仍然有效 - 有什么解决办法吗? 您是否有可能同时在导航控制器上推送/弹出多个视图控制器? ***.com/questions/9088465/… 可能会对您有所帮助。【参考方案2】:

Rahul 的答案是完美的解决方案。但是,如果您的标签栏中有超过 5 个标签,那么您将看到“更多”标签。您需要明确地重置此选项卡(只需将 tabBarController.moreNavigationController 弹出到 rootViewController)。

这里是代码示例:

for(UIViewController *viewController in tabBarController.viewControllers)

    if([viewController isKindOfClass:[UINavigationController class]])
       [(UINavigationController *)viewController popToRootViewControllerAnimated:NO];

[tabBarController.moreNavigationController popToRootViewControllerAnimated:NO];

【讨论】:

【参考方案3】:

这里有 Swift 5 供任何需要的人使用:

if let tabVcs = navigationController?.tabBarController?.viewControllers 
        for vc in tabVcs 
            if let navVc = vc as? UINavigationController 
                navVc.popToRootViewController(animated: false)
            
        
    

【讨论】:

【参考方案4】:

另一个选择是使用 NSNotifications。关闭模式视图(计时器上的幻灯片放映)时,我需要在所有选项卡上触发 popToRootViewController,这是我弄清楚如何做到这一点的唯一方法。 我在模态视图的 viewWillDissapear 方法中触发了 NSNotification,然后在我希望关闭的每个视图中响应它。

【讨论】:

【参考方案5】:
func popAll()

    let tabBarController = window!.rootViewController as! UITabBarController
    tabBarController.delegate = self

    if let tabBarViewControllers = tabBarController.viewControllers 


    let campusController = tabBarViewControllers[0] as! UINavigationController

    let campusTVC = campusController.viewControllers[0] as! CampusTVC

    _ = campusTVC.navigationController?.popToRootViewController(animated: false)

    let adController = tabBarViewControllers[1] as! UINavigationController

    let adminTVC = adminController.viewControllers[0] as! AdTVC

    _ = adminTVC.navigationController?.popToRootViewController(animated: false)

    let searchController = tabBarViewControllers[2] as! UINavigationController

    let searchTVC = searchController.viewControllers[0] as! SearchTVC
    _ = searchTVC.navigationController?.popToRootViewController(animated: false)


     


我的代码示例在 Swift 中弹出所有选项卡。这是在我的 App Delegate 中。 这就是我在 VC 中的称呼

let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.popAll()

【讨论】:

以上是关于弹出标签栏应用程序上的所有视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何在视图控制器中的标签栏和导航栏上全屏显示弹出视图?

如何从标签栏控制器弹出或模态显示视图控制器?

模态视图控制器隐藏标签栏

显示和关闭视图控制器后,iOS 7.1 上的标签栏背景丢失

如何隐藏带有另一个视图控制器的标签栏视图控制器?

iPhone在标签栏应用程序模板上的TabBarController之前创建视图