[英]Popping to specific ViewController in NavigationController stack
我已經在我的 SceneDelegate 中以編程方式設置了一個 NavigationController。 我的應用程序邏輯需要在某個階段返回到堆棧上的特定 ViewController。 問題是,當我使用popToViewController(_ viewController: UIViewController, animated: Bool) -> [UIViewController]?
,我似乎失去了對 NavigationController 的跟蹤——即使我沒有回到根控制器,也沒有可用的后退按鈕。
當我在有問題的 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>
我現在彈回LearnResultViewController
navigationController.viewControllers[1]
, 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
只是在標志I組LearnViewController
在viewDidLoad
原因willMove
進入時,被稱為LearnViewController
已經明明我只是想離開的時候流行和mainNavigationController
是一個全局變量,現在(主要是因為我認為這應該是全球性的,這樣它可以從到目前為止沒有幫助的任何地方引用......)。
現在,當我按下后退按鈕時,我可以返回VocabularyViewController
,但那里不再有后退按鈕——所以我的 NavigationController 堆棧似乎丟失了。
仍在willMove
我可以看到LearnResultViewController.navigationController
變為nil
- 這導致了我的問題。 上面提到的mainNavigationController
仍然有狀態,但“本地” navigationController becomes
nil:
(lldb) po mainNavigationController.viewControllers
▿ 2 elements
▿ 0 : <Vocabulary.MainViewController: 0x7fbd4570dcd0>
▿ 1 : <Vocabulary.VocabularyViewController: 0x7fbd4566ce80>
(lldb) po navigationController?.viewControllers
nil
(lldb) po navigationController
nil
我該怎么做才能回到所需的 ViewController 同時將我的堆棧/狀態保留在我的 NavigationController 中? 我應該采取另一種方法嗎?
坦率地說,我什至不明白為什么場景的 navigationController 首先設置為 nil ......
我試過你的方法,確實不行。
您應該從 LearnResultViewController 的導航堆棧中刪除 LearnViewController。
navigationController?.viewControllers.removeAll(where: { $0 is LearnViewController })
之后,當您點擊后退按鈕時,您將返回 VocabularyViewController。 后退按鈕將在那里。
您不應該為此覆蓋 willMove。
快速 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) } }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.