在iPhone上使用模态视图控制器编辑属性应该使用哪种模式?

时间:2010-04-26 00:26:18

标签: iphone cocoa-touch uiviewcontroller modal-dialog cocoa-design-patterns

我正在寻找通过iPhone上的模态视图执行基本属性编辑的良好模式。

假设我正在组合一个类似于Contacts应用程序的应用程序。 “详细信息”视图控制器在UITableView中显示所有联系人的属性。当UITableView进入编辑模式时,单元格中会显示一个泄露图标。单击一个单元格会使模式“编辑器”视图控制器显示一个允许用户修改所选属性的视图。此视图通常只包含一个文本框或选取器。用户单击取消/保存,“编辑器”视图将被关闭,“详细信息”视图将更新。

在这种情况下,哪个视图负责更新模型?

“编辑器”视图可以使用键值编码直接更新属性。这出现在CoreDataBooks示例中。这在某种程度上对我有意义,因为它将属性视为编辑器视图控制器的模型。

但是,这不是View Controller编程指南建议的模式。它建议“编辑器”视图控制器应该定义“细节”控制器采用的协议。当用户指示他们已完成编辑时,将使用输入的值回叫“详细信息”视图控制器,并且它将取消“编辑器”视图。使用此方法,“细节”控制器更新模型。如果您对多个属性使用相同的“编辑器”视图,则此方法似乎存在问题,因为只有一个回调方法。

很想获得有关哪种方法最有效的反馈。

2 个答案:

答案 0 :(得分:0)

这是一个艰难的要求 - 视图控制器指南建议在概念上看起来更清晰,但另一种方法可以更容易,特别是如果您使用的是Core Data。为了给出全面的一般性意见,我想说如果你使用的是核心数据,那么使用第一种方法,因为托管对象本身就有自己的上下文并且可以自行更新(而NSFetchedResultsController这样的类可以自动响应更新) 。

如果您没有使用Core Data,我会选择“官方”建议,因为它可以更轻松地手动管理更新的属性。至于对多个属性的关注,当然可以有多个委托方法并调用适当的方法。例如:

//if property is an address
if ([self.delegate respondsToSelector:@selector(editorView:didUpdateAddress:)])
    [self.delegate editorView:self didUpdateAddress:theAddress];

//if property is a name
if ([self.delegate respondsToSelector:@selector(editorView:didUpdateName:)])
    [self.delegate editorView:self didUpdateName:theName];
但是,这可能很难管理 - 你可能希望有一个属性的抽象超类,或者沿着这些线的东西。

答案 1 :(得分:0)

相关问题