理解模型-视图-控制器(MVC)

13

我有一个应用程序,希望有一个“背景”视图(视图控制器视图),在其上面,有多个UIView作为圆形绘制。我不明白如何实现所有这些,同时仍然遵循MVC模式...

模型和视图应该是不同的。这是否意味着通常需要一个用于视图的头文件和实现文件集,以及另一个(独立的)用于模型的集合 - 即使我的对象只是一个Circle类?或者,我会有一个Circle.hCircle.m集,然后在头文件中有两个接口块,一个用于模型,另一个用于视图,并且有两个实现块(再次一个用于模型,另一个用于视图)?

我见过一些人建议使用视图控制器处理loadView中的所有视图,并避免创建单独的自定义视图对象;这是否意味着我不应该为视图创建单独的.h.m文件?对我来说,后者在设计方面更加有组织。

此外,如果我要有多个视图对象和多个由视图控制器处理的模型对象,我将在控制器中将它们存储在两个数组中 - 一个用于模型,另一个用于视图。对吗?我的问题是:当我对每个模型使用键值观察时,如果索引在两个数组中的对象都不同,如何为每个模型对象修改相应的视图对象?

我考虑在视图中使用指向模型对象的指针,并从视图到模型进行KVO - 但这样就不通过控制器,因此完全破坏了MVC模式,对吗?

提前感谢。

2个回答

23

MVC是一个广泛的理念,更像是一种指导思想而非具体规则,并且并不总是以相同的方式实现。阅读苹果关于MVC的讨论,了解传统MVC和Cocoa中的MVC之间的区别。

很难说如何将MVC应用于您的应用程序,因为您没有告诉我们应用程序应该做什么,而且它似乎不是一个现实的应用程序。因此,我会尽力做出一些假设。一个只在固定位置的背景上绘制一堆圆圈的应用程序并不是很有趣 -- 它可能几乎全部都是视图,根本不需要控制器。所以,假设这些圆圈都在不同的方向上移动,用不同的颜色绘制,并且随着时间变化而改变大小。现在你开始需要一个模型,以便你可以跟踪这些圆圈所代表的数据,以及一个控制器来将模型转换为可以由视图表示的术语。

既然您特别问到绘制圆圈,让我们从视图开始。似乎有一个好主意是创建一个自定义视图,它知道如何根据必要的参数(区域、颜色和位置)绘制一个圆形。您可能会将这些东西作为属性,并覆盖-drawRect:,以便它可以绘制具有给定面积和给定颜色的圆。

我们不知道这些圆代表什么,但如果它们不代表任何事情,那么这并不好玩,所以让我们假设该应用程序的工作是帮助我们比较公司。我们有关于收入、市值、员工数量、信用评级、名称、股票代码等的数据。您可以创建一个自定义对象来存储每个公司的所有数据,或者您可以将其全部放在字典中。我们的模型是这些自定义对象或字典的集合。

注意,圆形视图不知道任何关于公司的信息,而模型不了解任何关于圆的信息。这是一件好事。这也是控制器发挥作用的地方。控制器是您将表达模型在视图中的代码放置的地方。它还解释视图中的事件,必要时更新模型。因此,我们的控制器既了解公司的具体情况,又了解圆形视图的属性。它为模型中的每个公司创建一个圆形视图。我希望圆的面积对应于公司的市值,垂直位置表示收入,水平位置表示雇员数量。我们将根据公司的信用评级分配颜色。当然,控制器应该跟踪所有的圆形视图,并找到一种方法来映射圆形视图和公司之间的关系。
现在你有了一个东西。它仍然是一个相当简单的应用程序,但你有了一个比较公司在几个维度上的有用图表。让我们改进它。
首先,很难知道哪个圆代表哪个公司。如果圆形视图可以选择显示一些文本就好了。让我们添加标题和副标题属性,并修改-drawRect:以分别在圆形上方和下方绘制这些字符串。我们还将更改控制器,以便在圆形上点击时,将该圆的标题和副标题设置为其公司的名称和股票代码,或者如果之前已设置,则清除它们。
其次,比较公司在某个时刻很好,但如果我们能显示随时间变化的情况会更有趣。让我们更改模型,包括收入,市值,雇员和评级的历史数据。我们可以更新控制器,以便可以使用历史数据来动画显示圆形。
第一个更改涉及如何在屏幕上绘制信息,根本不需要修改模型。第二个更改涉及我们需要处理哪些数据,根本不需要修改视图。您可以轻松地重用圆形视图来表示其他类型的数据,甚至可以用作空气曲棍球游戏中的球。它只是一个彩色圆形。您还可以在处理相同类型数据的另一个应用程序中重用模型。

我相信这个漫长的例子中假设的应用程序与你自己的应用程序几乎没有任何相似之处,但它可能有助于解释为什么MVC很有用,并指导你自己应用程序的结构。祝你好运。


3
谢谢,这对我非常有帮助。我创造了一个应用程序,其中有多个不同质量的圆圈。我会设置某些速度并使用一些我编写的物理函数来显示弹球之间的动量碰撞,就像在游泳池游戏中一样。它们是自由飞行的球体,只发生碰撞。我创建这个小应用程序的方式根本没有遵循MVC。我来自于C/C#背景,从未使用过MVC,所以一个例子正是我需要的。感谢您的示例,它真的很有帮助。 - Dalisto1

4

我从CS193P IPHONE APPLICATION DEVELOPMENT(2013年冬季课程)中得到了很好的解释。

模型-视图-控制器:

将所有对象分为三个阵营:

enter image description here

模型:您的应用程序是什么(一张卡片,一副牌,卡牌游戏逻辑)
控制器:如何向用户呈现您的模型(UI逻辑)。控制器知道有关UI的所有内容。
视图:控制器的手下。

这些阵营如何通信:

enter image description here

不要越过黄线。
您可以越过虚线。
越过实线有一些特殊规则。

enter image description here

控制器 -> 视图(通过Outlet
视图 -> 控制器(通过Data source(计数,dataAt),delegate(will,should,did),Target-action
模型 -> 控制器(通过Notification&Key Value Observing


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接