Swift-按错误顺序解散两个控制器



我的故事板中有这样的东西:NavigationController->A->B->C其中A、B和C是视图控制器。我呆在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吗?

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

您不能像尝试的那样连续调用pop两次,而且使用计时器很脆弱,不建议使用。(遗憾的是,pop方法没有像模态驳回方法那样采用完成处理程序。(

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

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

最新更新