iPhone - UINavigationController,重用 View ?

标签 iphone cocoa-touch uinavigationcontroller

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

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

为此,每次我想要 FirstEntityViewController 时,我都可以扫描导航堆栈以查找 [self isKindOfClass:[FirstEntityViewController class]]; 的对象,然后调用旨在重新调整该 View 的方法对于我当前想要看到的内容 - 只需以与重用 UITableViewCell 时相同的方式刷新数据即可。

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

如果我从导航堆栈中删除匹配的 Controller ,然后将其弹出到堆栈顶部,只要用户不返回到已移动的 FirstEntityViewController 实例或否则导航又会显得不一致。

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

还是这变得太复杂了?是否不需要担心这种情况,因为操作系统以与重用 UITableViewCell 相同的方式重用大部分 View Controller ,并且拥有 50 深的导航堆栈不会对实际内存或性能产生影响?

最佳答案

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

换句话说,顶 View 下面的 View 不会挂起,最终会在内存不足的情况下被卸载,因此您无需尝试重​​新使用 View Controller 。

关于iPhone - UINavigationController,重用 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1623271/

相关文章:

iphone - 尝试使用隐藏的 UINavigationBar 实现持久 UIToolBars 似乎是在操作未记录的 View 类

ios - 如何在按钮点击时实现 segue?

iphone - 需要一个解决方案来将日期/时间转换并存储为与设备时区相比正确的本地时间

iphone - 如何在线程中执行 GUI 操作 - IOS

objective-c - 真的卡在屏幕旋转 iOS 6 上,我需要一个锁定到纵向的 xib

iphone - 在 iPhone 应用程序中下载多个文件( objective-c )

ios - 如何保存导航 Controller 的状态? (iOS 6 之前)

ios - Iphone,获取 NSArray 中的国家/地区列表

objective-c - Cocoa-touch 和 UIButton 内容

iphone - 检查核心数据中的一对多关系引用了多少对象的最有效方法?