使用Interface Builder,NSObjectController子类和绑定时,在模型和视图之间插入控制器逻辑

Tri*_*cky 5 cocoa core-data objective-c interface-builder cocoa-bindings

在使用IB,NSObjectController子类和绑定时,我一直在努力理解插入​​控制器逻辑的最佳方法.

我需要在模型和视图之间插入控制器逻辑,我很难找到一种优雅的方法.是的,您可以将操作发送给文件所有者并处理其中的控制器逻辑,但是当某些核心数据模型可以扩展到具有深层关系结构的50个实体或更多实体时,这将开始加载到令人难以置信的锅炉板代码量.

一个非常简单的例子是这样的; 想象你有一个具有四个字符串属性的实体myTextWinter,myTextSpring,myTextSummer,myTextAutumn.你有一个通过NSObjectController连接到IB的视图.现在,假设用户可以通过选择菜单中的春,夏,秋,冬来选择他们希望查看的"季节" - 当选择该季节时,我想显示适当的季节文本.

在这个简化的例子中,我可以获取NSDocument子类中的对象,创建一个名为mySeasonText的属性,我在视图中绑定它,然后检查我的NSUserDefaults以获取适当的季节并将请求路由到模型中的相应属性.

问题来自于我有50个实体,有些实体有两个,三个或更多的关系,每个实体都有自己的季节特定文本属性集,我希望在从Season菜单中选择时切换.或者如果我将一堆nsarray控制器链接在一起以访问更深层次的对象.

到目前为止,我一直在做以下事情; 在我的每个模型对象中添加一个名为'mySeasonText'的属性,然后从我的控制器设置中获取设置,并路由到适当的季节.每当选择菜单中的新项目时,我都会刷新这些对象.

虽然这有效并消除了绝对大量的样板代码,但我的控制器逻辑现在已经在我的模型中了.

肯定有更好的办法!有人可以指点我正确的方向吗?

red*_*ulb 2

这是一个棘手的话题。苹果甚至在自己的文档中提到了这些挑战:

\n\n
\n

通过使用绑定技术,您可以轻松创建一个 Cocoa MVC 应用程序,其视图直接观察模型对象以接收状态更改的通知。然而,这种设计存在一个理论上的问题。视图对象和模型对象应该是应用程序中最可重用的对象。[\xe2\x80\xa6] 在设计方面,最好将模型和视图对象彼此分开,因为这可以增强它们的可重用性。

\n
\n\n

您正在寻找的设计模式是中介控制器- 一种使用可可绑定类插入控制器逻辑的方法:

\n\n
\n

中介控制器通常是从 Interface Builder 库中拖动的现成对象。您可以配置[中介控制器]以在视图对象的属性和控制器对象的属性之间建立绑定,然后在这些控制器属性和模型对象的特定属性之间建立绑定。因此,当用户更改视图对象中显示的值时,新值会通过中介控制器自动传递到模型对象进行存储\xe2\x80\x94;当模型的属性更改其值时,该更改将传递到视图以进行显示。

\n
\n\n

我喜欢这样看待它们:您是否看过电影或电视节目,其中两个角色需要交谈,但他们不会说任何相同的语言?他们找到其他人(或者喜剧中的另外 5 个人),每个人都有一种共同语言,然后通过玩一个巨大的电话翻译游戏进行交流。

\n\n

中介控制器有点像这样。

\n\n

随着您的应用程序的增长,他们会学习所有关于在这一视图上寻找这一事物的超级具体规则。这是应用程序需要运行的代码类型,但是当放入模型中时,您理所当然地会觉得它很糟糕。

\n\n

对于几个具体而详细的示例,Apple 提供了这个令人惊讶的详细文档:Bindings Message Flow

\n\n

有关此问题以及相关 MVC + 绑定的一些非常好的讨论,请参阅:

\n\n\n