关于Apple's MVC pattern的输入处理,我有点困惑。根据Apple的说法,您的对象应该分为模型对象(处理数据),查看对象(显示内容)和控制器(绑定两者,还处理事件和输入)。但是,许多Apple的本机UIKit视图--UIScrollView,UIControl对象等 - 自己完成所有输入处理,可能让他们的控制器通过委托和数据源了解它。这真让我困惑。在我看来,MVC三元组的坚固性取决于模型和视图相当愚蠢(因此很容易交换)。当所有操作系统级别的事件复杂性集中在控制器中时,您可以非常好地分离关注点。另一方面,向视图添加输入处理似乎将其变成了一种自己的控制器。
我在这里遗漏了什么吗?思考这个问题的正确方法是什么?
答案 0 :(得分:1)
用户输入是MVC模式中 View 的一部分。它们直接与用户交互,并根据请求或通过委派将数据提供给 Controller ,然后 Controller 可能会使用该输入来影响 Model 的更改。 / p>
答案 1 :(得分:0)
“哑巴”和“轻松可交换”不一定是一回事。
按钮包含许多我们不想在每个控制器中重写的功能:图像的着色以指示突出显示,如果在触摸之前水龙头偏离一定距离,则允许取消等。滚动视图包含很多物理学。
换句话说,“哪个显示内容”是视图对象的错误描述。 UIView - 基类 - 只提供事件数据,但是子类提供更高级别的数据,例如“按钮被点击”或“滚动视图减速到停止”。
答案 2 :(得分:0)
要考虑的一件事是你的观点。
当我们大多数人编码时,我们的Model是一个数据对象(可能由文件或数据库等支持),我们的View是UIView
(可能在Interface Builder中设置/配置),我们的Controller是{ {1}}。
如果您不编写应用程序,该怎么办?如果你的世界是UIViewController
怎么办?您仍然可以进行基本的MVC分离。您的模型由UITableView
协议表示,您的视图仍然是UITableViewDataSource
,其中包含设置和配置,您的控制器是UIView
协议。那里的所有碎片甚至是分开的,分离与使用UITableViewDelegate
时的分离完全不同。您可以看到数据更改分离的实际示例。当您在数据源协议中的数据没有任何反应时。您必须在表的Controller位上调用UIViewController
方法才能实现数据的更改。
项目越小,看到MVC模式就越难。如果将“按钮”分解为3个不同的对象,则“按钮”将更难使用,但您可以在单个对象内使用MVC图案来创建良好的封装。 reloadData
以公共和私有属性的形式拥有它的模型,一个视图(UIButton
仍然)和一个控制器,它是接受事件并对视图和/或视图进行修改的一堆代码适当的模型。