在不使用UINavigationController时,我可以以编程方式访问/修改导航堆栈吗?

时间:2018-01-29 13:16:30

标签: ios uinavigationcontroller segue

我没有使用UINavigationController,也没有使用UITabController(更多关于以下内容*)。我有一系列7个视图控制器,用户可以通过它来配置应用程序。

现在我希望能够以编程方式在导航堆栈上推送和弹出视图,具体取决于整个过程中发生的情况。具体来说,我想直接跳转到某个视图控制器,但要使展开包含一些我跳过的视图。每个答案都告诉你弄乱UINavigationController。此question仅回答有关在调试器中查看堆栈的问题。

*也许我已经因为不使用UINavigationController而烧伤了自己。但是每本教科书都说UINavigationController用于分层视图。我设置了一系列同行视图。所以我认为我没有使用UINavigationController遵循最佳实践,但说实话,我开始后悔。但是必须有某个导航堆栈,因为展开肯定会让你回到以前的视图控制器。

1 个答案:

答案 0 :(得分:-1)

如果我能正确理解你的想法,你真的想要实现层次结构,但是要使用动态项。实际上,堆栈是分层结构,只有每个父母只有一个孩子。

通过代码......

Dirty Way

你需要UINavigationController:

:first-child

这应该为您提供足够的信息来控制堆栈。

如果您想要动画,可以这样使用:

    let shoudlRemoveIndex = 3
    let shouldAdd = self.storyboard?.instantiateViewController(withIdentifier: "MyCoolViewController")

    if var stack = navigationController?.viewControllers,
        let newVC = shouldAdd {
        stack.remove(at: shoudlRemoveIndex)
        stack.append(newVC)
        // or: stack.insert(newVC, at: desiredIndex)

        navigationController?.viewControllers = stack
    }

清洁方式

其他方法可能是segue和unwind segue。您可以在本文中查看其工作原理:https://medium.com/@mimicatcodes/create-unwind-segues-in-swift-3-8793f7d23c6f

在每个ViewController上进行一次unwindSegue,只需调用正确的segue。通过这种方式,您将拥有更清晰的结构和更直观的故事板。

导航控制器内容的想法是真正的堆栈,但实际上您可以根据需要对其进行操作。 最好使用已经制作好的工作组件作为UINavigationController,而不是实现定制和奇怪的东西,不能保证在未来的iOS版本中有效。其中一种方法是尝试实例化viewControllers并获取它们的视图并用新的视图替换当前的viewController视图,但保留对旧视图的引用...方式太麻烦了产生方式:)