【问题标题】:Can I programmatically access / modify the navigation stack when NOT using a UINavigationController?我可以在不使用 UINavigationController 时以编程方式访问/修改导航堆栈吗?
【发布时间】:2018-07-08 04:52:47
【问题描述】:

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

现在我希望能够根据沿途发生的情况以编程方式在导航堆栈上推送和弹出视图。具体来说,我想直接跳转到某个视图控制器,但要让它包含一些我已经跳过的视图。每个答案都告诉你弄乱 UINavigationController。这个question 只回答有关在调试器中查看堆栈的问题。

*也许我因为不使用 UINavigationController 而烫伤了自己。但是每本教科书都说 UINavigationController 用于分层视图。我正在设置一系列对等视图。所以我认为我不使用 UINavigationController 是在遵循最佳实践,但老实说,我开始后悔了。然而,某处必须有一个导航堆栈,因为展开肯定会带您回到之前的视图控制器。

【问题讨论】:

  • 你可以查看我更新的答案

标签: ios uinavigationcontroller segue


【解决方案1】:

如果我能正确理解您的想法,那么您确实想实现一个层次结构,但具有动态项目。而且实际上栈是层次结构的,只是每个父节点只有一个子节点。

通过代码...

肮脏的方式

您将需要 UINavigationController:

    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
    }

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

如果你想要动画,你可以使用这种方式:

    if let newVC = shouldAdd {
        navigationController?.pushViewController(newVC, animated: true)
    }

    if var stack = navigationController?.viewControllers {
        stack.remove(at: shoudlRemoveIndex)
        navigationController?.viewControllers = stack
    }

干净的方式

其他方法可能是 segue 和 unwind segue。你可以在这篇文章中查看它是如何工作的:https://medium.com/@mimicatcodes/create-unwind-segues-in-swift-3-8793f7d23c6f

每个 ViewController 上都有一个 unwindSegue,然后调用正确的 segue。这样,您将拥有更清晰的结构和视觉上更易于理解的故事板。


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

【讨论】:

  • 抱歉,我不得不对此投反对票。这个具有挑战性的问题和原因的全部前提是我没有 UINavigationController。
  • 没问题。我会为那些已经走上你的路并需要路标去哪里的人保留答案。
猜你喜欢
  • 2012-10-29
  • 2015-05-12
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 2015-09-20
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多