iOS - 如何推送到视图控制器并在返回时保持正确的“视图堆栈”
Posted
技术标签:
【中文标题】iOS - 如何推送到视图控制器并在返回时保持正确的“视图堆栈”【英文标题】:iOS - How to push to a view controller and maintain the correct "View Stack" when going back 【发布时间】:2015-01-08 08:31:27 【问题描述】:我有一个导航控制器,其中包含应用程序的主视图(各种仪表板),然后通过 segue 等分支到应用程序中的其他视图。
有一个汉堡菜单,它使用 Cocoa Pods 滑动视图控制器。基本上,我的问题是是否可以通过菜单导航到特定的视图控制器并保持正确的“堆栈”返回。我知道您可以只推送到单个控制器,但我希望(如果可能)保留视图层次结构。
例如
菜单中有一个链接到第 1.3 页
我希望能够推送到第 1.3 页
然后使用该视图上的后退按钮转到 Page 1.2,然后是 Page 1.1 等等。
我不确定这是否是 ios 应用程序中的标准做法,还是采用 android 风格的方法并将视图添加到堆栈中是否更好,而不用担心在返回时尝试形成正确的导航结构意见。
希望所有这些都有意义。
【问题讨论】:
正如您在 Android 方法中提到的,您会继续推动视图控制器吗?我认为这不是一个好方法。如果您要移动到第 100 页,即使它保持正确的堆栈条目,它仍然是内存开销。如果我目前了解您的问题,最好在事件上决定特定的视图控制器并呈现它。 我很确定这就是 Android 应用程序的功能,尽管这纯粹是一种观察,而不是经验。是的,我试图衡量在此类事情上的普遍共识是什么。例如,如果我想使用菜单显示“创建工单”视图。是否只是加载和呈现单个控制器(返回按钮转到当时显示的任何页面)。或者,如果最好清除堆栈并添加“票证”,然后添加“创建票证”,以便在插入后返回票证视图。等.. 【参考方案1】:如果您乐于在代码中而不是 segue 中执行此操作,您可以使用 UINavigationController 的 setViewControllers:animated:
方法(请参阅 documentation)。您将需要实例化相关的 VC,使用任何相关的数据/状态对其进行初始化,然后使用它们构建一个数组,从根视图控制器到顶部视图控制器的顺序:
NSArray *newStack = @[rootVC, ..., page11VC, page12VC, page13VC];
[self.navigationController setViewControllers:newStack animated:YES];
然后从 page13VC 弹出将转到 page12VC 等。您可以使用导航控制器的 viewControllers
属性获取 rootVC 和任何其他预先存在的 VC。
【讨论】:
这正是我想要的。 完美运行。谢谢!这让我发疯了。 没问题 - 很高兴你把它整理好了。【参考方案2】:我在我的项目中遇到了同样的问题,这是我的经验。 如果你只是想做简单的跳转,可以试试三个基本的导航功能:
[self.navigationController popToRootViewControllerAnimated:YES]
[self.navigationController popToViewController:[[self.navigationController.viewControllers count] - mypopcount] animated:YES];
[self.navigationController popViewControllerAnimated:YES];
将动作与按钮绑定,你可以这样做。 但是,如果你想在ios中做更灵活的页面跳转,你必须考虑: 首先,你需要确认这些视图控制器之间没有直接的数据交互,也就是说你需要coreData或者其他sqlite工具来存储数据,这样目标页面才能自己加载数据。 其次,您应该考虑策略,页面跳转意味着弹出所有视图控制器并推送一个新的,或者只是弹出或推送一个新的视图控制器就在导航堆栈上。 祝你好运!
【讨论】:
以上是关于iOS - 如何推送到视图控制器并在返回时保持正确的“视图堆栈”的主要内容,如果未能解决你的问题,请参考以下文章
当一个新的视图控制器被推送到导航控制器时,将一个子视图保持在屏幕上的同一位置?
如何通过 didselectrow 手动点击按钮时推送到详细视图控制器;再次返回,然后作为数据源数组的计数推送?
iOS - pushViewController 推送到 nil 视图控制器