0

我对Apple 的 MVC 模式的输入处理有点困惑. 根据 Apple 的说法,您的对象应分为模型对象(处理数据)、视图对象(显示内容)和控制器(绑定两者并处理事件和输入)。然而,Apple 的许多原生 UIKit 视图(UIScrollView、UIControl 对象等)自己完成所有输入处理,可能通过委托和数据源让它们的控制器知道它。这真的让我很困惑。在我看来,MVC 三元组的坚固性取决于模型和视图都相当愚蠢(因此很容易交换)。当所有操作系统级别的事件复杂性都集中在控制器中时,您就可以很好地分离关注点。另一方面,向视图添加输入处理似乎会将其变成一种自己的控制器。

我在这里错过了什么吗?思考这个问题的正确方法是什么?

4

3 回答 3

1

用户输入是MVC 模式中视图的一部分。他们直接与用户交互,并根据请求或通过委托将数据提供给Controller,然后 Controller 可能会使用该输入来影响对Model的更改。

于 2013-10-31T23:02:46.890 回答
0

“哑巴”和“易于交换”不一定是同一回事。

按钮包含很多我们不想在每个控制器中重写的功能:图像着色以指示突出显示,如果在触摸之前点击偏离一定距离允许取消,等等。滚动视图包含很多物理。

换句话说,“显示东西”是对视图对象的错误描述。UIView - 基类 - 只提供事件数据,但子类提供更高级别的数据,例如“按钮被点击”或“滚动视图减速到停止”。

于 2013-11-01T12:31:19.327 回答
0

要考虑的一件事是你的观点。

当我们大多数人编写代码时,我们的模型是一个数据对象(可能由文件或数据库等支持),我们的视图是一个UIView(可能在 Interface Builder 中设置/配置),我们的控制器是UIViewController.

如果您不编写应用程序怎么办?如果你的世界是一个UITableView? 您仍然可以进行基本的 MVC 分离。你的模型由UITableViewDataSource协议表示,你的视图仍然是UIView它的设置和配置,你的控制器是UITableViewDelegate协议。那里的所有部分甚至分开,分离与使用UIViewController. 您可以看到一个分离数据更改的实际示例。当您使用数据源协议中的数据时,什么也不会发生。您必须在表的控制器位上调用一个reloadData方法才能实现数据已更改。

项目越小,就越难看到 MVC 模式。如果将“按钮”分解为 3 个不同的对象,则使用起来会困难得多,但是您可以在单个对象内使用 MVC 模式来创建封装良好的对象。AUIButton具有公共和私有属性形式的模型,一个视图(UIView仍然)和一个控制器,控制器是一堆接受事件并根据需要对视图和/或模型进行修改的代码。

于 2013-11-01T13:50:57.127 回答