gpt4 book ai didi

objective-c - 使用 Interface Builder、NSObjectController 子类和绑定(bind)时在模型和 View 之间插入 Controller 逻辑

转载 作者:太空狗 更新时间:2023-10-30 03:54:07 27 4
gpt4 key购买 nike

我一直在努力了解在使用 IB、NSObjectController 子类和绑定(bind)时插入 Controller 逻辑的最佳方式。

我需要在模型和 View 之间插入 Controller 逻辑,我正在努力寻找一种优雅的方法来实现这一点。是的,您可以将操作发送给文件所有者并在其中处理 Controller 逻辑,但是当一些核心数据模型可以扩展到五十个或更多具有深层关系结构的实体时,这将开始安装数量惊人的样板代码。

一个非常简单的例子是这样的;假设您有一个具有四个字符串属性 myTextWinter、myTextSpring、myTextSummer、myTextAutumn 的实体。您有一个通过 NSObjectController 连接到 IB 中的 View 。现在,假设用户可以通过从某处的菜单中选择 Spring 、夏季、秋季、冬季来选择他们希望查看的“季节”——选择该季节后,我想显示相应季节的文本。

在这个简化的示例中,我可能会获取 NSDocument 子类中的对象,创建一个名为 mySeasonText 的属性,我将其绑定(bind)到我的 View 中,然后检查我的 NSUserDefaults 以获取适当的季节并将请求路由到适当的属性在模型中。

当我有 50 个实体时,问题就来了,其中一些实体具有两层、三层或更深的关系,每个实体都有自己的一组特定于季节的文本属性,我希望在从“季节”菜单中进行选择时在这些属性之间切换。或者,如果我有一堆链接在一起的 nsarraycontroller 来访问更深层次的对象。

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

虽然这有效并消除了绝对大量的样板代码,但我的 Controller 逻辑现在在我的模型中。

一定有更好的方法!有人可以指出我正确的方向吗?

最佳答案

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

By using the bindings technology, you can easily create a Cocoa MVC application whose views directly observe model objects to receive notifications of state changes. However, there is a theoretical problem with this design. View objects and model objects should be the most reusable objects in an application. […] Design-wise, it's best to keep model and view objects separate from each other, because that enhances their reusability.

您正在寻找的设计模式是 Mediating Controller - 使用 cocoa 绑定(bind)类插入 Controller 逻辑的方法:

Mediating controllers are typically ready-made objects that you drag from the Interface Builder library. You can configure [Mediating controllers] to establish the bindings between properties of view objects and properties of the controller object, and then between those controller properties and specific properties of a model object. As a result, when users change a value displayed in a view object, the new value is automatically communicated to a model object for storage—via the mediating controller; and when a property of a model changes its value, that change is communicated to a view for display.

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

中介 Controller 有点像那样。

随着您的应用程序的增长,他们会学习所有关于在何处寻找这一个 View 上的这件事的 super 具体规则。这是应用程序需要运行的代码类型,但当将其放入您的模型中时,您确实觉得讨厌

对于几个具体和详细的​​示例,Apple 提供了这个非常详细的文档:Bindings Message Flow .

有关此内容和相关 MVC + 绑定(bind)的一些非常好的讨论,请参阅:

关于objective-c - 使用 Interface Builder、NSObjectController 子类和绑定(bind)时在模型和 View 之间插入 Controller 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13762028/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com