开发者社区> 问答> 正文

在NavigationController堆栈中弹出特定的ViewController

我已经在SceneDelegate中以编程方式设置了一个NavigationController。我的应用程序逻辑要求在某个阶段返回堆栈上的特定ViewController。问题是当我做这件事的时候popToViewController(_ viewController: UIViewController, animated: Bool) -> [UIViewController]? ,
我似乎失去了NavigationController的跟踪--即使我没有弹回根控制器,也没有Back按钮可用。

当我在ViewController中时,我的NavigationController的ViewControlers堆栈如下所示:

(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]
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现在是一个全局变量(主要是因为我认为它应该是全局的,这样它就可以从任何地方引用,到目前为止都没有帮助.)。

当我按后退按钮时,我可以回到VocabularyViewController,但是我已经没有后退按钮了--所以我的NavigationController的堆栈似乎丢失了。

还在里面willMove我看得出来LearnResultViewController.navigationController成nil-这导致了我的问题.上述mainNavigationController到那时还拥有州,但是“本地”navigationController becomes零:

(lldb) po mainNavigationController.viewControllers
▿ 2 elements
  ▿ 0 : <Vocabulary.MainViewController: 0x7fbd4570dcd0>
  ▿ 1 : <Vocabulary.VocabularyViewController: 0x7fbd4566ce80>

(lldb) po navigationController?.viewControllers
nil

(lldb) po navigationController
nil

在将堆栈/状态保留在NavigationController中时,我能做些什么才能回到所需的ViewController呢?还有别的办法吗?

坦率地说,我甚至不明白为什么场景的导航控制器被设置为零。

展开
收起
游客5akardh5cojhg 2019-12-04 16:38:02 515 0
1 条回答
写回答
取消 提交回答
  • 斯威夫特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)
        }
    }
    
    2019-12-04 16:39:02
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载