【问题标题】:Dismiss any loaded view in a navigation stack and return to the root of navigation stack关闭导航堆栈中任何加载的视图并返回到导航堆栈的根
【发布时间】:2021-06-01 08:00:38
【问题描述】:

Tab1 -> Nav1 -> Root1VC -> Child1VC

Tab2 -> Nav2 -> Root2VC -> Child2VC

在 Root1VC 中,我根据用户的登录状态显示不同的内容。

假设我访问了 Child1VC,然后点击了 Tab2,在 Tab2 上我点击了登录。此时,我想关闭 Nav1 堆栈中所有呈现的视图并返回到 Nav1 的根并在 Root1VC 中调用一个函数。怎么做?

我有以下代码,它有效,但我不确定这是否是最好的方法。

let appDelegate = UIApplication.shared.delegate as! AppDelegate

if let tabBar:UITabBarController = appDelegate.window?.rootViewController as? UITabBarController {
    
    if let menuNav:UINavigationController = tabBar.viewControllers?[2] as? UINavigationController {
        var topPresentedVC: UIViewController!
        
        if let topVC = menuNav.topViewController {
            topPresentedVC = topVC
            
        } else if let presentedVC = menuNav.presentedViewController {
            topPresentedVC = presentedVC
        }
        
        if topPresentedVC != nil {
            if !topPresentedVC.isKind(of: MoreViewController.classForCoder()) {
                topPresentedVC.navigationController?.popToRootViewController(animated: false)
            }
            
            if let moreVC = menuNav.viewControllers.first as? MoreViewController {
                moreVC.initMenus()
            } else {
                print("Can't find first VC")
            }
        }
    }
}

【问题讨论】:

    标签: ios swift uinavigationcontroller uitabbarcontroller


    【解决方案1】:

    下面的函数在某些事情不符合预期的情况下返回“false”,如果一切按预期进行,则返回“true”。如果您想了解更多关于哪个期望不是肉的详细信息,那么您必须将函数转换为 throwing one 而不是返回 false,您必须创建一个详细的错误。

    函数可以作为全局函数或类型的一部分。

    func popToRootViewControllerOfSecondTabOnLogOut() -> Bool {
        guard let window = UIApplication.shared.keyWindow else {
            return false
        }
        guard let tabBarController = window.rootViewController as? UITabBarController else {
            return false
        }
        guard tabBarController.viewControllers?.indices.contains(2) == .some(true) else {
            return false
        }
        guard let navigationController = tabBarController.viewControllers?[2] as? UINavigationController else {
            return false
        }
        
        navigationController.popToRootViewController(animated: true)
        
        guard let moreViewController = navigationController.viewControllers.first as? MoreViewController else {
            return false
        }
        
        moreViewController.initMenus()
        
        return true
    }
    

    如果逻辑按预期执行,则上述逻辑的简短版本没有反馈

    let nvc = ((UIApplication.shared.keyWindow?.rootViewController as? UITabBarController)?.viewControllers?[2] as? UINavigationController)
            nvc?.popToRootViewController(animated: true)
    (nvc?.viewControllers.first as? MoreViewController)?.initMenus()
    

    【讨论】:

    • 优雅的代码,感谢您的建议。我更想知道我们是否可以用更少的代码行实现相同的结果?
    猜你喜欢
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2021-09-22
    • 1970-01-01
    • 2018-03-17
    相关资源
    最近更新 更多