【问题标题】:Swift - Dismiss two controllers wrong orderSwift - 解雇两个控制器错误的顺序
【发布时间】:2021-04-08 01:58:09
【问题描述】:

我的 Storyboard 中有这样的内容: 导航控制器 -> A -> B -> C 其中 A、B 和 C 是 ViewController。我住在 C 中,我有代表 B 控制器的变量并执行以下操作:

    controllerB?.navigationController?.popViewController(animated: true)
    self.navigationController?.popViewController(animated: true)

应该先关闭 B 控制器然后关闭 C。但是当我在模拟器中执行此操作时,我看到 C 控制器首先被关闭,之后我看到 B 控制器一段时间后它也被关闭。 我尝试过这样的延迟:

DispatchQueue.main.asyncAfter(deadline: .now() + 5.0)

但它也不起作用 你能帮助我吗?甚至有可能在 C 之前解雇 B 吗?

【问题讨论】:

    标签: ios swift uiviewcontroller uinavigationcontroller


    【解决方案1】:

    为什么不同时弹出它们呢? 您可以为导航控制器编写一个扩展,然后弹回传入的视图控制器,无论有多少 vc 被推送到顶部。

    extension UINavigationController {
        func popBackTo(viewcontroller: UIViewController.Type, animated: Bool) {
            for vc in self.viewControllers {
                if vc.isKind(of: viewcontroller) {
                    self.popToViewController(vc, animated: animated)
                }
            }
        }
    }
    

    用例:

    self.navigationController?.popBackTo(viewcontroller: ViewControllerA.self, animated: true)
    

    【讨论】:

    • 这是个好主意。虽然我使用了 Duncan C 的解决方案,因为 A 实际上是根控制器,但我相信有一天这对我也会有用。
    【解决方案2】:

    您不能像尝试那样连续调用 pop 两次,并且使用计时器很脆弱,不推荐使用。 (很遗憾,pop 方法没有像模态关闭方法那样使用完成处理程序。)

    只需使用popToViewController(_:animated:)。将消息发送到self.navigationController,并将 A 作为要弹出的视图控制器发送。

    如果 A 是根,只需使用self.navigationController.popToRootViewController(animated:true)

    【讨论】:

    • 谢谢。它有效,我不知道 popToRootViewController 方法。
    猜你喜欢
    • 2012-05-01
    • 2017-09-10
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多