我已经以编程方式在我的NavigationController中设置了一个SceneDelegate。我的应用程序逻辑要求在某个阶段返回堆栈上的特定ViewController。问题是,当我使用popToViewController(_ viewController: UIViewController, animated: Bool) -> [UIViewController]?时,我似乎失去了对NavigationController的跟踪--即使我没有弹回根控制器,也没有Back按钮可用。
当我在ViewController中时,我的NavigationController的ViewControllers堆栈如下所示:
(lldb) po navigationController?.viewControllers
▿ Optional<Array<UIViewController>>
▿ some : 4 elements
▿ 0 : <Vocabulary.MainViewController: 0x7fbd4570dcd0>
▿ 1 : <Vocabulary.VocabularyViewController: 0x7fbd4566ce80>
▿ 2 : <Vocabulary.LearnViewController: 0x7fbd45532180>
▿ 3 : <Vocabulary.LearnResultViewController: 0x7fbd4569f900>
(lldb) po mainNavigationController.viewControllers
▿ 4 elements
▿ 0 : <Vocabulary.MainViewController: 0x7fbd4570dcd0>
▿ 1 : <Vocabulary.VocabularyViewController: 0x7fbd4566ce80>
▿ 2 : <Vocabulary.LearnViewController: 0x7fbd45532180>
▿ 3 : <Vocabulary.LearnResultViewController: 0x7fbd4569f900>现在我又回到了navigationController.viewControllers[1] in LearnResultViewController中,如下所示:
override func willMove(toParent parent: UIViewController?) {
if let _ = mainNavigationController.topViewController?.isKind(of: LearnResultViewController.self) {
if isPresenting {
if let vocabularyViewController = mainNavigationController.viewControllers.first(where: { $0 is VocabularyViewController} ) {
mainNavigationController.popToViewController(vocabularyViewController, animated: true)
//navigationController?.popToViewController(vocabularyViewController, animated: true) //same behavior
}
}
}
}isPresenting只是我在LearnViewController中在viewDidLoad中设置的一个标志,因为willMove在进入LearnViewController时已经被调用了,很明显,我只想在离开时弹出,而mainNavigationController现在是一个全局变量(主要是因为我认为它应该是全局的,这样就可以从任何没有帮助的地方引用……)。
现在,当我按后退按钮时,我可以回到了,但是那里已经没有后退按钮了--所以我的NavigationController堆栈似乎丢失了。
当我还在willMove的时候,我可以看到LearnResultViewController.navigationController变成了nil --这导致了我的问题。上面提到的mainNavigationController到那时仍有状态,但“本地”navigationController becomes为0:
(lldb) po mainNavigationController.viewControllers
▿ 2 elements
▿ 0 : <Vocabulary.MainViewController: 0x7fbd4570dcd0>
▿ 1 : <Vocabulary.VocabularyViewController: 0x7fbd4566ce80>
(lldb) po navigationController?.viewControllers
nil
(lldb) po navigationController
nil在将堆栈/状态保存在NavigationController中时,我能做些什么才能回到所需的NavigationController?我还有别的办法吗?
坦率地说,我甚至不明白为什么场景的navigationController被设置为零在第一.
发布于 2019-12-04 09:25:53
我试过你的方法,但真的不管用。
您应该将LearnViewController从LearnResultViewController导航堆栈中删除。
navigationController?.viewControllers.removeAll(where: { $0 is LearnViewController })在此之后,当您按后退按钮时,您将返回到VocabularyViewController。后面的按钮就在那里。
您不应该为此而重写willMove。
发布于 2019-12-04 06:35:21
为斯威夫特4.0
for controller in self.navigationController!.viewControllers as Array {
if controller.isKind(of: DashboardVC.self) {
_ = self.navigationController!.popToViewController(controller, animated: true)
break
}
}
斯威夫特3
let viewControllers: [UIViewController] = self.navigationController!.viewControllers
for aViewController in viewControllers {
if aViewController is YourViewController {
self.navigationController!.popToViewController(aViewController, animated: true)
}
}
https://stackoverflow.com/questions/59169922
复制相似问题