iPhone-UINavigationController,重用视图?

iPhone-UINavigationController,重用视图?,iphone,cocoa-touch,uinavigationcontroller,Iphone,Cocoa Touch,Uinavigationcontroller,根本问题是“您可以在导航堆栈上推送多少UIViewController?”而不会导致内存警告或导致看门狗终止 假设我有一个应用程序,它基本上是三个实体的数据库,其中每个实体都可以与其他实体建立关系,并且关系显示在UIViewController上。用户可以遵循这些关系,每个关系都会产生一个新的控制器-如果实体是a、B和C,并且a->B->C->B->C->a,那么每种视图都会在堆栈上出现两次。我了解如何推送和弹出,如何推送回特定的控制器,我认为与其无限期地扩展导航堆栈,不如在导航堆栈中重用视图控

根本问题是“您可以在导航堆栈上推送多少UIViewController?”而不会导致内存警告或导致看门狗终止

假设我有一个应用程序,它基本上是三个实体的数据库,其中每个实体都可以与其他实体建立关系,并且关系显示在UIViewController上。用户可以遵循这些关系,每个关系都会产生一个新的控制器-如果实体是a、B和C,并且a->B->C->B->C->a,那么每种视图都会在堆栈上出现两次。我了解如何推送和弹出,如何推送回特定的控制器,我认为与其无限期地扩展导航堆栈,不如在导航堆栈中重用视图控制器

为此,每次需要FirstEntityViewController时,我都可以扫描导航堆栈以找到一个对象,其中
[self iskindof class:[FirstEntityViewController类]]
这很好,但可能会对NavigationController产生影响。如果我使用
UINavigationController:popToViewController:animated:
我想它会放弃我弹出到的视图上方的所有内容,包括用户希望在点击导航栏中的“后退”时找到的视图。所以用户点击一段关系,点击返回,然后说“哈?”

如果我从导航堆栈中删除匹配的控制器,然后将其弹出到堆栈顶部,则只要用户不返回到移动的FirstEntityViewController实例,返回行为仍然正常,否则导航将再次看起来不一致

从堆栈中移除控制器,并以某种方式在堆栈中保留一个位置,以便在弹出重用的控制器时可以将其替换回原来的位置,这是正确的解决方案吗?我是否应该维护自己的视图种类和数据显示列表,以便在弹出视图时可以替换即将弹出的视图下方的视图,并在返回导航之前保持一步


还是这太复杂了?甚至不必担心这种情况,因为操作系统重用大部分视图控制器的方式与重用UITableViewCells的方式相同,并且拥有50个深度的导航堆栈不会对内存或性能产生任何影响?

ViewController实例仍保留在UINavigationController的堆栈中,但除俯视图外的任何视图均可随时卸载(视图控制器通过
viewDidUnload
消息得到通知)


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

上次我检查时,您不能将已在navcontroller堆栈上的viewcontroller重新推到它上面。您必须创建一个新的viewcontroller并将其推到堆栈上,每个后退按钮都会将其从堆栈中弹出。您所能做的最好的事情就是缓存ViewController,并根据需要分发它们——只要它们从navcontroller堆栈中弹出即可。但它可能不会为你节省很多内存


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

听起来有两个问题:1)堆栈上可以有多少东西,2)给定的东西可以多次在堆栈上?对吧?有点。可以肯定的是,堆栈上可以有多少东西。一个给定的事物是否会不止一次出现在堆栈上?我相当肯定答案是肯定的,我只是担心允许它的影响(例如,我收到了记忆警告)。解决方案可能是等待内存警告,然后开始查找要终止的堆栈项,例如最后一个“重要”之前的所有内容视图。卸载视图时导航会发生什么情况-链接到丢失的视图后仍允许返回或返回不再是选项?否。当视图再次出现时,将通过loadView和viewDidLoad消息重新加载。您可以通过模拟内存不足的情况,在模拟器中对此进行测试。