2

我有两个表视图和一个由UINavigationController管理的详细视图。当在第二个表上选择一行时,它会弹出一个详细视图,允许更改该行表示的特定数据。我需要能够在UITableViewUIViewController之间切换,而不会丢失UIViewControllers中可能已经更改的任何数据(按钮选择,在字段中输入的文本值等)。使用ARC从导航控制器弹出时保留视图控制器

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

的问题是,当一个UIViewController从导航控制器弹出,该内存自动释放,而且由于我使用ARC,我不能只是保持一个指针,与在UITableView一个retain命令。

我知道我可以在每次选择相应的表格行时手动重建视图,但我觉得这可能是一个混乱的解决方案。我想过的另一个选项是保存一个推送UIViewControllers的数组,并检查选定的表行是否与创建新表之前存在的值相对应,但这可能也会变得混乱。

有什么建议吗?

回答

0

您最后的期望是在您的问题中说明的内容:您希望在视图控制器而不会丢失在这些控制器中执行的操作的任何信息。 但是,如果您考虑MVC模式的工作方式,则应该将视图控制器视为视图和模型之间的粘合逻辑。该视图不是持久的,这就是为什么当视图不再需要时,ARC去除拥有的视图控制器是合法的。相反,应用程序运行时应该保留的仅仅是模型数据:模型数据将在所涉及的视图控制器之间共享,每次都会重新创建视图控制器,并根据模型数据更新相应的视图。为什么视图控制器应该保持活动的唯一原因是它的alloc-init-loadView需要太多(例如:视图是OpenGL支持的),但在这种情况下,我建议你在AppDelegate中保留强引用,要求它在更换模型数据时刷新内容。

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

这种方法并不复杂,让您以一种干净的方式构建应用程序的可能性。明天,您可以更改视图控制器结构(即其视图和逻辑),而不会影响与其他视图控制器的通信,因为此模型仅通过该模型进行管理。

0

对此有几个解决方案,就像你的建议。

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

您提出的第二种解决方案更加优雅。只需在该视图控制器中编写自己的init方法,然后使用plist文件中的数据初始化视图控制器

0

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

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

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

想到这个的方法是使用模型 - 视图 - 控制器模式。表格和详细视图数据存储在模型中;意见呈现数据;并且控制器负责更新模型并在视图之间导航。

相关问题