Swift - 关闭两个控制器的错误命令

Swift - Dismiss two controllers wrong order

我的情节提要中有这样的内容: 导航控制器 -> 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?

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

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

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

为什么不同时弹出它们呢? 您可以为导航控制器编写一个扩展,并弹出返回到传入的 viewcontroller,而不管有多少 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)