如何从导航堆栈中的任何位置弹出到任意视图控制器

Posted

技术标签:

【中文标题】如何从导航堆栈中的任何位置弹出到任意视图控制器【英文标题】:How to pop to an arbitrary view controller from anywhere in a navigation stack 【发布时间】:2010-09-23 18:01:57 【问题描述】:

我正在开发一个基于导航的应用程序,我选择它是为了可以将控制器推入和弹出堆栈。前进很容易——只需推动一个新的控制器。只要您转到根视图控制器,向后移动就很容易。有一个名为popToViewController:animated, 的方法,但我没有创建要从当前视图控制器中弹出的控制器,因此编译器抱怨我没有声明它。我知道它是堆栈上的第二个控制器(根上方的一个)。我可以用它去那里吗?

【问题讨论】:

【参考方案1】:

UINavigationController 的 viewControllers 属性具有 viewControllers 以便它们被推送,因此您可以使用它以及您知道将哪个视图控制器弹出到该视图控制器..这里是参考 UINavigationController ref

【讨论】:

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:NO]; 让我回到 root + 1 控制器。我阅读了popToViewController:animated 上的文档,但需要返回UINavigationController。谢谢!【参考方案2】:

我通常会创建一个 NavigationController 对象,该对象了解我的 UINavigationController 和我的 viewControllers。如果你给你的每一个 VC 一个这样的对象的引用,或者让它成为一个单例,那么它可以为你处理这样的事情。

在视图控制器中嵌入导航逻辑并没有错,但是当他们知道所有其他视图控制器时,这会使它们更难维护。将导航逻辑封装在共享对象中使您的应用程序更易于理解和维护。

YMMV

【讨论】:

+1 我喜欢这听起来,但我不知道如何实现它。我确实有一个单例,用于跟踪当前玩家、分数等。它还读取/写入 .plist 中的数据,例如玩家姓名。您的NavigationController 对象是否与UINavigationController? 不同您是否在应用程序启动时创建它,然后让它创建所有视图控制器?我很新,我想我知道如何做到这一点,但我需要更多细节...... 我喜欢用只读属性将它挂在应用程序委托上。创建一个 NavigationController 类并为其提供 UINavigationController 的字段。添加一个采用 UINavigationController 的构造函数。在 application:didFinishLaunchingWithOptions: 创建 NavigationController 的实例。现在,不要在视图控制器中推送/弹出导航堆栈,而是在 NavigationController 上创建公共方法来处理这个问题。这将允许您从视图控制器中移除相互依赖关系并更清晰地分离您的关注点。 我最近在大型应用程序中使用的另一种方法是使用通知进行导航。在这种情况下,导航控制器将订阅通知中心并监听导航事件。当用户操作需要导航时,处理视图控制器将获取描述导航事件的通知。通过这样做,我能够从除应用程序委托之外的任何地方完全删除导航控制器引用。作为额外的奖励,其他对象可以轻松订阅导航事件以设置 UI 状态。

以上是关于如何从导航堆栈中的任何位置弹出到任意视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何从导航堆栈中推送/弹出uiviewcontroller时收到警报

弹出到导航堆栈中的特定视图控制器

当视图控制器弹出或推入导航控制器堆栈时如何获得通知

如何从导航控制器一次弹出两个视图?

导航控制器如何弹出整个堆栈,包括根

从导航堆栈中弹出视图控制器时从右侧滑入