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