addSubview:重写导航堆栈?

时间:2012-10-01 09:06:38

标签: objective-c ios

我正在开发一个使用控制器包含模式的应用,如iOS SDK中的View Controller文档中所述。

我编写了控制器容器,效果很好。我的控制器基本上包含两个子视图,它们同时显示它们,根据用户正在做什么,一个滑动另一个。工作很棒。

现在,我想在导航视图中使用此容器控制器。这是为了让推动segues工作。实际上,从我所包含的控制器中,我希望能够使用导航堆栈,打开新控制器,并在用户完成时弹出。

但是,我注意到如果导航视图是以我的容器控制器作为根容器实例化的,那么事情就会崩溃。

特别是,我注意到了这一点:

在iOS文档中,容器控制器调用addChildController:然后调用addSubview:。这似乎打破了导航堆栈,因为push segue不起作用 - 它的行为类似于模态。我相信这样做是因为addSubview会重置导航堆栈。

我通过用[self.navigationController pushViewController ...]替换addChildController和addSubview来确认这一点。我确认这是addSubview的一个问题,因为当我省略对addChildController的调用时,我可以重现这个问题。

当我这样做时,导航堆栈正常工作。但是,当然,我的容器控制器没有,因为只有“最近推动”的控制器才可见。

我这样做是因为在我控制的控制器中,我想将一个新的控制器推入堆栈,当用户完成时,我想“弹出”堆栈,而不重新加载“前一个控制器”。 / p>

使用模态segue重新加载前一个控制器;使用推送控制器不会。

我找不到任何关于addSubview行为的文档及其对导航堆栈的影响。

提前感谢你们光临的任何光明!

1 个答案:

答案 0 :(得分:0)

我在完全理解你在做什么方面遇到了一些麻烦,但我认为你想要做的就是我正在做的事情。

我有一个UINavigationController,它的rootView是一个容器UIViewController。该控制器按照常规方法添加子项。其中一个子视图会推送可能会弹出的其他视图。

其中一个推送视图COULD消息appDelegate并使其自己成为rootViewController,如果它想。一般情况下,只要您对视图控制器保持强引用,就可以将其从拥有它的任何人中删除,并使用navigationControllers viewControllers数组将其放入心中。