2010-09-23 39 views
4

我正在研究基于导航的应用程序,并选择了它,以便我可以在堆栈上和离开堆栈上推送和弹出控制器。向前移动很容易 - 只需推新控制器即可。只要转到根视图控制器,移回就很容易。有一种叫popToViewController:animated,的方法,但是我没有创建我想从当前视图控制器中弹出的控制器,所以编译器会抱怨我没有声明它。我知道这是堆栈中的第二个控制器(一个在根上)。我可以用它来到那里吗?如何从导航堆栈中的任意位置弹出到任意视图控制器

回答

4

一个UINavigationController的viewControllers属性在顺序viewControllers,他们推,这样你就可以使用你的这些知识视图控制器是流行这种看法controller..here是一个参考UINavigationController ref

+3

'[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1]动画:NO];'拉去回到根+ 1个控制器。我阅读了'popToViewController:animated'上的文档,但需要返回到'UINavigationController'。谢谢! – Steve 2010-09-23 18:46:04

1

我通常创建一个NavigationController对象,它具有关于我的UINavigationController和我的viewControllers的知识。如果你给每个VC提供一个这样的对象的引用,或者让它成为一个单例,那么它可以为你处理这样的事情。

在视图控制器中嵌入导航逻辑没有任何问题,但是当他们知道每个其他视图控制器时,可能会使他们难以维护。将导航逻辑封装在共享对象中可让您的应用更易于理解和维护。

YMMV

+0

+1我喜欢这听起来如何,但我不知道如何实现它。我确实有一个单例,用于跟踪当前玩家,分数等。它还读取/写入.plists中的数据,如玩家名称。你的'NavigationController'对象与'UINavigationController'不同吗?'当应用程序启动时创建它,然后让它创建所有视图控制器?我很新,我想我有一个想法如何做到这一点,但我需要一些更具体的... – Steve 2010-09-23 18:44:20

+0

我喜欢做的是把它挂在应用程序委托与只读属性。 创建一个NavigationController类并为其提供UINavigationController的字段。添加一个带有UINavigationController的构造函数。在应用程序中:didFinishLaunchingWithOptions:创建NavigationController的一个实例。现在,不要在视图控制器中推送/弹出导航堆栈,而是在NavigationController上创建公共方法来处理此问题。这将允许您从视图控制器中删除相互依赖关系,并更干净地分离您的问题。 – logancautrell 2010-09-23 20:22:56

+0

我最近在大型应用程序中使用的另一种方法是使用通知进行导航。在这种情况下,导航控制器将订阅通知中心并监听导航事件。当用户动作需要导航时,处理视图控制器将获取描述导航事件的通知。通过这样做,我能够从应用程序委托以外的任何地方完全删除导航控制器引用。作为额外的奖励,其他对象可以轻松地订阅导航事件以设置UI状态。 – logancautrell 2010-09-23 20:23:25

相关问题