保持导航控制器的状态并且只改变视图

Posted

技术标签:

【中文标题】保持导航控制器的状态并且只改变视图【英文标题】:Keep state of navigation controller and only change view 【发布时间】:2016-07-08 02:21:13 【问题描述】:

我有一个带有下拉菜单的应用程序,作为我的NavigationControllertitleView。当用户选择下拉菜单中的一项时,整个视图应该切换内容,但是,NavigationBar 应该保持不变。 NavigationBar 不应重新加载任何数据,而 titleView 应保持下拉菜单

打开应用时的原始视图:

触摸下拉菜单时的视图:

我目前看到了几种解决方法:

    为每个选项设置一个UIViewController,执行segue,然后重新加载数据。

    为什么不好:我必须为每个 ViewController 设置一个 segue 标识符,这意味着如果我的下拉菜单中有 15 个选项,我将有 210 个 segue 标识符。我还必须重新加载我所有的 NavigationBar 数据。 为什么这样好:我将有一个清晰的区域来设置每个单独的视图。

    根据需要以编程方式添加和删除 UIButtonsUILabelsUIWhatevers

    为什么这样不好:这将在一个 ViewController 中创建大量代码,并且可能难以调试。 为什么这很好:NavigationBar 永远不会被重新加载。

    添加一个容器并根据需要为每个项目嵌入一个唯一的ViewController

    为什么这很糟糕:我的所有工作仍将在主 ViewController 中,我必须在一个控制器中管理嵌入式 ViewController 的逻辑。 为什么这很好:NavigationBar 永远不会重新加载。

    其他人建议的完全不同的方法,因为我不知道最有效的方法。

因此,总而言之,在切换 View 中的主要内容时,保持 NavigationBar 状态的最有效方法是什么?

【问题讨论】:

这个 UINavigationController 是你应用程序的根视图吗? (基本上是一个 UITabBarController,顶部有一个下拉菜单,而不是底部的 UITabBar) 是的 NavigationController 是根视图。 选项 3。我不明白它为什么会变得复杂。根视图控制器只负责切换容器视图中的视图控制器。每个包含的视图控制器仍然是自包含的 【参考方案1】:

选项 3 是您列出的三个中最好的。您要添加的视图控制器越多,选项 1 和 2 将变得越来越复杂。与 UINavigationControllerUITabBarControllerUIPageViewController 相比,它们不需要更复杂即可处理 10 个屏幕和 100 个屏幕。

我建议创建一个自定义容器视图控制器 (Apple's Reference)

我看到了 2 种直接的方法来实现这一点:

    子类化UIViewController - 这就是 Apple 的容器视图控制器的实现方式 子类 UITabBarController - 我已成功完成此操作,子类 UITabBarController 以在顶部而不是底部显示自定义标签栏。

【讨论】:

以上是关于保持导航控制器的状态并且只改变视图的主要内容,如果未能解决你的问题,请参考以下文章

在ios中保持视图控制器的第一个状态

加载视图时导航栏跳跃

状态栏在关闭模式视图后保持隐藏并在几秒钟后出现

Swift - 远程通知和导航控制器流程

带有透明/模糊导航栏的 iOS 7 视图控制器布局问题

Swift 4仅为一个视图控制器设置导航属性