可以说我有一个视图,myView,一个视图控制器,myViewController和某种模型对象myModel.此外,假设该模型具有两个符合KVO的属性,arrayOfPeopleNames
以及arrayOfAnimalKinds
(两个NSStrings).
在我看来,我希望有两个弹出窗口绑定到这两个数组的内容.
我的问题是,如果myController有一个myModel的引用,并且下拉列表绑定到myViewController,那么设置一个关键路径是不错的做法myModel.arrayOfPeopleNames
?
或者我是否需要在myViewController中设置一个额外的NSArray,它反映myModel中的一个并转而绑定到该keypath?
从实现的角度来看,前者似乎更简单(我不必让控制器数组镜像模型数组),但我想知道它是否将模型暴露给视图.
意见?
您不应该在控制器中镜像模型的数组.虽然我不太关心在一个非常简单的情况下直接绑定到模型的数组,但您也可以将UI对象绑定到NSArrayController,后者管理模型的数组.这将提供模型和UI之间的分离,更重要的是处理排序,选择,添加和删除对象等任务.
通过关注KVO和绑定违反"纯粹的"模型视图控制器设计,我可以看到你来自哪里,但这不是你应该担心的事情.即使KVO通知直接从模型传递到视图,设置和更改视图和模型之间的连接仍然是控制器的责任(仅在这种情况下,它通过IB完成).例如,您不希望模型对象获取对视图的引用,并将自身绑定到UI,这将是控制器的责任.
作为另一个要避免的例子,考虑一下你的模型是否有一个"动物ID"数组而不是名字.您可能需要创建一个值转换器或格式化程序来进行转换,而不是创建将动物ID转换为模型中人类可读动物名称的方法.这允许您保持模型和视图之间的分离级别.
还要记住,设计模式的目的是降低编写问题解决方案的复杂性,永远不要增加它.你会发现这正是Cocoa的工作方式,即使它可能并不总是遵循最严格的模式定义.