0

我对输入处理有点困惑的问候Apple's MVC pattern。据苹果,你的目的应被分为模型对象(处理数据),查看对象(其显示的东西),和控制器(其结合两个,并且还处理事件和输入)。然而,许多Apple的本机UIKit视图(UIScrollView,UIControl对象等)自己完成所有输入处理,可能会让他们的控制器通过委托和数据源了解它。这真让我困惑。在我看来,MVC黑社会的坚定性取决于模型和观点是否相当愚蠢(因此易于交换)。当所有操作系统级别的事件复杂性都集中在控制器中时,您可以很好地区分问题。另一方面,向视图添加输入处理似乎将其转变为其自己的一种控制器。用户输入如何适应Apple的MVC模式?

我在这里错过了什么吗?想想这个的正确方法是什么?

回答

1

用户输入是在MVC模式下的查看的一部分。他们直接与用户交互并根据请求或通过授权将他们的数据提供给控制器,然后该控制器可以使用该输入来影响的更改。

+0

但根据苹果对此事的官方页面: “控制器对象可能解释在一些特定应用的方式向用户输入,然后或者可以告诉一个模型对象做什么用这个输入例如”添加新值“或”删除当前记录“ - 或者它可能会让模型对象在其某个属性中反映出已更改的值。基于相同的用户输入,某些控制器对象也可能会指示视图对象更改方面其外观或行为,如告诉按钮禁用自身。“ – Archagon

+1

@Archagon我会假设Apple在该句子中使用术语*用户输入*表示“来自用户界面的数据”。 – trojanfoe

0

“哑”和“轻松交换”不一定是同一件事。

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

换句话说,“哪些显示内容”是视图对象的错误特征。 UIView - 基类 - 仅提供事件数据,但子类提供更高级别的数据,如“点击按钮”或“滚动视图减速停止”。

0

一件事想是你的观点。我们的模型是一个数据对象(可能由文件或数据库等支持),我们的视图是UIView(可能在Interface Builder中进行设置/配置),我们的控制器是UIViewController

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

项目越小,看到MVC模式就越困难。如果一个“按钮”被分成3个不同的对象,使用起来会比较困难,但是您可以在单个对象内部使用MVC模式来创建良好的封装。 A UIButton具有公共和私人属性,视图(仍然为UIView)和控制器的形式,它是一堆接受事件并对视图和/或模型进行适当修改的代码。

相关问题