iPhone - UINavigationController,重用视图?

时间:2009-10-26 05:45:18

标签: iphone cocoa-touch uinavigationcontroller

根问题是“你可以在导航堆栈上推送多少个UIViewControllers?”没有引起内存警告或获得看门狗终止。

假设我的应用程序基本上是三个实体的数据库,其中每个实体都可以与其他实体建立关系,并且关系显示在UIViewController上。用户可以遵循这些关系,每个人都会调出一个新的控制器 - 如果实体是A,B和C以及A​​-> B-> C-> B-> C-> A然后是每种视图在堆栈上两次。我理解如何推送和弹出,如何推回到特定的控制器,我认为不仅仅是无限延长导航堆栈,最好在导航堆栈中重用视图控制器。

要做到这一点,每次我想要一个FirstEntityViewController时,我都可以扫描导航堆栈以找到[self isKindOfClass:[FirstEntityViewController class]];的对象,然后调用设计用于重新调整该视图的方法以获取我当前想要查看的内容 - 只需刷新数据与重用UITableViewCell时的方式相同。

除了它可能对NavigationController产生的影响外,这很好。如果我使用UINavigationController:popToViewController:animated:我认为它会丢弃我正在弹出的视图上方的所有内容,包括用户在导航栏中点击“返回”时希望找到的视图。所以用户点击一个关系,然后点击回去“嗯?”

如果我从导航堆栈中删除匹配的控制器,然后将其弹出到堆栈的顶部,只要用户没有返回到被移动的FirstEntityViewController的实例,则后退行为保持正常。否则导航似乎不一致。

是否正确的解决方案是从堆栈中删除控制器,并以某种方式在堆栈中保留一个位置,以便在重新使用的控制器弹出时可以将其替换回来自哪里?我应该保留自己的视图类型和数据显示列表,以便在弹出时我可以替换要弹出的视图下面的视图,保持领先一步的导航?

或者这太复杂了?是否有必要担心这种情况,因为操作系统重用大部分视图控制器的方式与重用UITableViewCells的方式相同,并且在拥有50个深度的导航堆栈时没有真正的内存或性能影响?

2 个答案:

答案 0 :(得分:4)

ViewController实例保留在UINavigationController的堆栈中,但除了顶视图之外的任何视图都可以随时卸载(视图控制器通过viewDidUnload消息通知)。

换句话说,顶视图下方的视图不会挂起,最终会在内存不足的情况下卸载,因此您无需尝试重​​新使用视图控制器。

答案 1 :(得分:0)

最后我检查过你无法将已经在navcontroller堆栈上的viewcontroller再次推回到它上面。你将不得不创建一个新的viewcontroller并将其推入堆栈,每个后退按钮将从堆栈中弹出一个。你可以做的最好的事情就是制作一个viewcontrollers的缓存,并根据需要将它们分开 - 只要它们从navcontroller堆栈中弹出即可。但它可能不会通过节省内存来为你买单。

UITableViews有点不同,因为在任何给定时间内只有相对较少数量的单元格在视图中,一旦单元格离开屏幕,它就会被移除并返回到池中。如果您可以保证链的maxdepth是固定的,那么您可以采用类似的窗口方案。如果没有,你可能必须坚持深入并尽快保持警惕释放记忆。