MVC和cocoa绑定最佳实践问题

时间:2008-12-10 17:58:58

标签: objective-c cocoa model-view-controller cocoa-bindings

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

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

我的问题是,如果myController有myModel的引用,并且下拉列表绑定到myViewController,那么在myModel.arrayOfPeopleNames行设置关键路径是不错的做法?

或者我是否需要在myViewController中设置一个额外的NSArray,它反映myModel中的一个并改为绑定到该keypath?

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

评论

1 个答案:

答案 0 :(得分:8)

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

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

作为另一个要避免的事情的例子,考虑一下你的模型是否有一个“动物ID”数组而不是名字。您可能需要创建一个值转换器或格式化程序来进行转换,而不是创建将动物ID转换为模型中人类可读动物名称的方法。这使您可以保持模型和视图之间的分离级别。

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