2

我有两个表视图和一个由UINavigationController. 当在第二个表上选择一行时,它会弹出到一个详细视图,允许更改该行表示的特定数据。我需要能够UITableViewUIViewController不丢失 UIViewControllers 中可能已更改的任何数据(按钮选择、在字段中输入的文本值等)之间切换。

基本上,一旦UIViewController呈现,应该能够在表格和详细视图之间来回切换而不会丢失任何数据。

问题是,当UIViewController从导航控制器弹出 a 时,该内存会自动释放,并且由于我使用的是 ARC,因此我不能只retainUITableView.

我知道每次选择相应的表行时我都​​可以手动重建视图,但我觉得这可能是一个混乱的解决方案。我想到的另一个选择是保留一个 push 数组,UIViewControllers并在创建新行之前检查所选表行是否与现有值对应,但这也可能会变得混乱。

有什么建议么?

4

3 回答 3

0

就像你建议的那样,有几个解决方案。

由于内存问题,阵列解决方案效率极低。

您提出的第二个解决方案要优雅得多。只需在该视图控制器中编写您自己的 init 方法并使用 plist 文件中的数据初始化视图控制器

于 2012-09-12T15:41:38.310 回答
0

您在这种来回视图中的最终愿望是您在问题中所说的:您希望在视图控制器之间切换而不会丢失在这些控制器中执行的操作的任何信息。但是,如果您考虑 MVC 模式的工作原理,您应该将视图控制器视为视图和模型之间的粘合逻辑。视图不是持久的,这就是为什么 ARC 在不再需要视图时摆脱拥有的视图控制器是合法的。相反,当您的应用程序运行时,您应该只保留模型数据:模型数据将在所涉及的视图控制器之间共享,每次都将重新创建视图控制器,并且将根据模型数据更新相应的视图。视图控制器应该保持活动状态的唯一原因是它的 alloc-init-loadView 占用太多(例如。

所以基本上你应该做的是: - 选择表 - 提取与表关联的模型数据,包括与视图控制器相关的所有信息 - 推送视图控制器;保存对模型的所有视图修改 - 当视图控制器弹出时,模型数据将仅返回 - 下次,当您再次推送视图控制器时,您将恢复模型并重新初始化视图控制器。

这种方法并不复杂,并且可以让您以简洁的方式构建应用程序。明天您可以更改您的视图控制器结构(即它的视图和逻辑),而不会影响与其他视图控制器的通信,因为这仅由模型传递管理。

于 2012-09-12T15:54:56.180 回答
0

如果我正确阅读了这个问题,那么您就有一个由相同模型数据驱动的 tableView 和 detailView。在详细视图中对模型数据进行更改时,您希望这些更改保持不变。

如果您在弹出详细视图时根据控件的状态更新模型,那么这些更改将持续存在,并且在您下一次深入查看详细视图时这些更改将可见。

您没有提到表格数据采用什么形式,但我们假设它NSArrayNSMutableDictionaries. 当您点击该行时,该didSelectRowAtIndexPath:方法需要通过细节控制器上的属性将该数组索引中的字典传递给细节视图控制器。详细视图控制器将更新解除它的方法中的字典值。

考虑这一点的方法是使用模型-视图-控制器模式。表和明细视图数据存储在模型中;视图呈现数据;控制器负责更新模型并在视图之间导航。

于 2012-09-12T15:59:53.247 回答