簡體   English   中英

彈出到 NavigationController 堆棧中的特定 ViewController

[英]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組LearnViewControllerviewDidLoad原因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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM