- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在努力了解在使用 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/
我有一个 foo 类,它有一个 bar 方法,它接受可调用的东西(函数指针/仿函数)。这个可调用的东西应该作为绑定(bind)元素传递给另一个方法 doit 和第三个方法 bar_cb 方法。 #in
我正在尝试在我的 WPF 4.0 应用程序(使用 VS 2010 Pro RTM)中创建自定义 TabItem 模板/样式,但尽管一切似乎都正常工作,但我注意到跟踪窗口中存在绑定(bind)错误。 我
作为一名刚接触 Android 的开发人员,我想我可能误解了绑定(bind)服务。 我创建了一项服务来结束对服务器的访问。作为此服务的一部分,该服务正在监听多播地址,以识别本地网络上的设备何时出现和消
这个问题在这里已经有了答案: What is the use of the JavaScript 'bind' method? (23 个回答) 关闭 7 年前。 所以我一直在尝试了解一些 JS 上
我不明白这三种语法之间的区别: where a = f (b) do a <- f (b) do let a = f (b) 我确实明白了a <- f(b)与其他两个不同,在大多数情况下,我尝试了所有
我在将 Cocoa 项目从手动同步接口(interface)模型转换为绑定(bind)模型时遇到问题,这样我就不必担心接口(interface)粘合代码。 我关注了 CocoaDevCentral C
我正在尝试找出一种好的方法来对处理大数据集的代码进行并行化,然后将结果数据导入 RavenDb。 数据处理受 CPU 限制和数据库导入 IO 限制。 我正在寻找一种解决方案,以对 Environmen
我正在 foreach 循环中生成单选按钮。我试图将选中的属性绑定(bind)到父级中的基本可观察值。不幸的是,当单击单选按钮时,父级的属性似乎没有在单击处理程序中更新。 基于一些previous w
在我的 Windows Phone 应用程序中,我有两个 LongListSelectors并排在页面上。我想做到这一点,以便当用户滚动其中一个时,另一个滚动相同的量。 两个 LongListSele
我在网上看到这个问题准备面试: Given a non-preemptive kernel which type of process will get affected morein terms o
我有一个 foreach 绑定(bind),如下所示: Summary Permitting 原因是有两个选项卡始终存在,并且我根据是否添加了其他选项卡来添加其他选项
任何人都有绑定(bind)相同的情况DataContext到 TextBlock 中的 Text 属性(例如)。 我必须分配 DataContext以我的风格反射(reflect)基于 Datacon
给定以下代码: Login 和下面的javascript $(function () { $('#btnLogin').click(function () { co
我使用 boost::asio 创建了一个服务器。我在绑定(bind)到端点时遇到问题。所以,如果我在构造函数中初始化一个接受器: Server::Server(QWidget *parent) :
我正在将现有项目从 MySQL 转换为 Postgres。代码中有相当多的原始 SQL 文字使用 ? 作为占位符,例如 SELECT id FROM users WHERE
似乎在绑定(bind)某些数据时出错了,有人可以帮我解决我哪里出错了,尽管我无法弄清楚。 真的不需要在这里显示太多,这是 Binding,我已经通过移除背景并在其中放置颜色来测试背景,效果很好。 编辑
我正在尝试使用 wcf 构建一个 http 监听器(web 服务)。这个监听器是一个更大的桌面应用程序的一部分。此桌面应用程序还会调用 http 监听器。 当监听器接收到数据时,它应该被传递到桌面应用
嘿嘿。 我正在使用 Node.JS 和 child_process 来生成 bash 进程。我试图了解我是否正在执行 I/O 绑定(bind)、CPU 绑定(bind)或两者兼而有之。 我正在使用 p
尝试执行以下操作并出现“Got interpolation ({{}}) where expression was expected”错误。 {{item.name}} 谢谢!
我有一个导入的 Java 库,它是我解决方案中的“绑定(bind)库”项目。 我正在尝试从解决方案中的另一个项目绑定(bind)到第 3 方库中的服务。 第 3 方库文档 [在 java 中] 非常简
我是一名优秀的程序员,十分优秀!