5

假设我有一个视图 myView、一个视图控制器 myViewController 和某种模型对象 myModel。此外,假设模型有两个符合 KVO 的属性,arrayOfPeopleNamesarrayOfAnimalKinds(都是 NSStrings)。

在我看来,我希望将两个弹出窗口绑定到这两个数组的内容。

我的问题是,如果 myController 有对 myModel 的引用,并且下拉列表绑定到 myViewController,那么按照以下方式设置 keypath 是一种好习惯myModel.arrayOfPeopleNames吗?

或者我是否需要在 myViewController 中设置一个额外的 NSArray 来镜像 myModel 中的那个并绑定到该键路径?

从实现的角度来看,前者似乎要简单得多(我不必使控制器数组镜像模型数组),但我想知道它是否将模型暴露给视图。

意见?

4

1 回答 1

8

您不应该在控制器中镜像模型的阵列。尽管在一个非常简单的情况下我不会太担心直接绑定到模型的数组,但您也可以将 UI 对象绑定到管理模型数组的 NSArrayController。这将提供模型和 UI 之间的分离,更重要的是处理诸如排序、选择、添加和删除对象等任务。

我可以通过担心 KVO 和绑定违反“纯”模型视图控制器设计来了解您的来源,但这不是您应该担心的事情。即使 KVO 通知直接从模型传递到视图,设置和更改视图和模型之间的连接仍然是控制器的责任(仅在这种情况下它是通过 IB 完成的)。例如,您不希望模型对象获得对视图的引用,并将其自身绑定到 UI,这将是控制器的职责。

作为要避免的另一个示例,请考虑您的模型是否具有“动物 ID”数组而不是名称。您可能希望创建一个值转换器或格式化程序来进行转换,而不是创建一种方法来将模型中的动物 ID 转换为人类可读的动物名称。这允许您保持模型和视图之间的分离级别。

还要记住,设计模式的目的是降低编写问题解决方案的复杂性,而不是增加它。您会发现这正是 Cocoa 的工作方式,尽管它可能并不总是遵循最严格的模式定义。

于 2008-12-10T18:12:19.763 回答