我有一个相当简单的设置:RootViewController(它是一个UITableViewController)。其中的每个单元格都显示了一些不同人的统计数据。您可以点击任何这些单元格来推送DetailViewController(UIViewController),并修改统计数据(存储在模型对象中)。在用户完成修改该人的统计数据后,他们单击“返回”按钮,导致popViewControllerAnimated被调用。
我的问题是:在RootViewController中知道此播放器的统计信息已更改的最佳方法是什么,并相应地更新了单元格?我是否必须在RootViewController中记录哪个单元被点击,然后在DetailViewController完成后调用相应的setNeedsDisplay?如果是这样,我应该采用哪种方法? viewWillAppear中?
或者有更好的方法吗?这似乎是一项相当普遍的任务,而且我遗漏了一些明显的东西。
答案 0 :(得分:2)
这取决于您的模型的设计方式以及您是否使用Core Data。
基本原则是观察可能在详细视图中更改的模型对象的属性。当细节控制器中的某些内容发生变化时,不知何故将其表格单元格标记为脏。然后,当表视图再次可见时,使用[tableView cellForRowAtIndexPath:]
获取更改的单元格并重新配置单元格。如果单元格不可见,cellForRowAtIndexPath:
方法将轻松返回nil
,这将使您无需花时间更新不需要它的单元格。
如果你正在使用核心数据(你可能应该这样做),NSFetchedResultsController
几乎所有这些都适合你。它将观察您的模型对象,并将controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
消息发送给每个已更改单元格的委托。然后,您可以对表视图进行适当的更改。
我建议使用基于导航的应用程序模板创建一个新的Xcode项目,并选中使用核心数据进行存储复选框。该模板具有上述模式的良好默认实现。