首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹出到NavigationController堆栈中的特定NavigationController

弹出到NavigationController堆栈中的特定NavigationController
EN

Stack Overflow用户
提问于 2019-12-04 06:14:05
回答 2查看 227关注 0票数 0

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

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

代码语言:javascript
复制
(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中,如下所示:

代码语言:javascript
复制
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:

代码语言:javascript
复制
(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被设置为零在第一.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-04 09:25:53

我试过你的方法,但真的不管用。

您应该将LearnViewController从LearnResultViewController导航堆栈中删除。

代码语言:javascript
复制
navigationController?.viewControllers.removeAll(where: { $0 is LearnViewController })

在此之后,当您按后退按钮时,您将返回到VocabularyViewController。后面的按钮就在那里。

您不应该为此而重写willMove。

票数 1
EN

Stack Overflow用户

发布于 2019-12-04 06:35:21

为斯威夫特4.0

代码语言:javascript
复制
for controller in self.navigationController!.viewControllers as Array {
        if controller.isKind(of: DashboardVC.self) {
            _ =  self.navigationController!.popToViewController(controller, animated: true)
            break
        }
    }

斯威夫特3

代码语言:javascript
复制
let viewControllers: [UIViewController] = self.navigationController!.viewControllers
for aViewController in viewControllers {
    if aViewController is YourViewController {
        self.navigationController!.popToViewController(aViewController, animated: true)
    }
}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59169922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档