2011-03-24 124 views
13

我有一个应用程序,我想要有一个“背景”视图(视图控制器视图),最重要的是,多个UIView s自己绘制为圆形。我只是不明白如何实现所有这一切,同时仍然坚持MVC ...了解模型 - 视图 - 控制器

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

我见过一些人推荐使用视图控制器来处理loadView中的所有视图,并避免创建单独的自定义视图对象;这是否意味着我不应该为视图创建单独的一组.h.m文件?后者在设计方面似乎比我更有组织性。另外,如果我有多个视图对象和由视图控制器处理的多个模型对象,我会将它们存储在控制器的两个数组中 - 一个用于模型,另一个用于视图。对?我的问题是:当我在每个模型上使用键值观察时,对于每个模型对象,我将如何更改正确的对应视图对象(假设两个数组中的两个对象的索引都不相同)?

我正在考虑使用指向视图内部的模型对象的指针,以及从视图到模型的KVOing--但它不会通过控制器,从而完全打破MVC,对吧?

预先感谢您。

回答

23

MVC是一个很大的概念。它不是一个具体的规则,而是一个指导性的哲学,并不总是以相同的方式实施。阅读Apple's discussion of MVC以了解可可中传统MVC和MVC之间的差异。

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

由于您具体了解绘制圆圈,我们先从视图开始。在给定必要参数的情况下,知道如何绘制圆的自定义视图似乎是个不错的主意:区域,颜色和位置。您可能会创建这些属性,并重写-drawRect:以便以给定颜色绘制给定区域的圆。

我们不知道这些圆圈代表什么,但如果它们没有代表什么东西,那没什么好玩的,所以我们假设应用程序的工作是帮助我们比较公司。我们有关于收入,市场资本总额,员工数量,信用评级,姓名,股票代码等的数据。您可以创建自定义对象来存储每个公司的所有数据,也可以将它们全部放在字典中。我们的模型是一组这些自定义对象或字典。

请注意,圈子视图并不知道关于公司的任何内容,并且该模型不知道有关圈子的任何信息。这是一件好事。这也是控制器进来的地方。控制器是您放置代码的地方,它使用视图直观地表达模型。它还从视图中解释事件,并根据需要更新模型。因此,我们的控制人员都知道公司的具体情况以及圈子视图的属性。它为模型中的每个公司创建一个循环视图。我想要一个圈子的区域对应于公司的市值,代表收入的垂直位置和表示雇员人数的横向位置。我们将根据公司的信用评级分配一种颜色。当然,控制者应该跟踪所有的圈子视图,以及在圈子视图和公司之间进行映射的方法。

现在你已经有了一些东西。这仍然是一个非常简单的应用程序,但是您可以在多个维度上比较公司的有用图表。让我们改进它。

首先,很难知道哪个圈子代表哪家公司。如果圆形视图可以选择显示某些文本,那将会很好。让我们添加标题和副标题属性,并修改-drawRect:分别在圆上方和下方绘制这些字符串。我们还将更改控制器,以便点击或点击圆圈可将该圆圈的标题和副标题设置为公司的名称和股票代码,或者如果之前已设置,则清除它们。其次,很高兴能够在某个时刻对公司进行比较,但如果我们能够随着时间的推移显示变化,则更加有趣。让我们改变模型以包含收入,市值,员工和评级的历史数据。我们可以更新控制器,以便它可以使用历史数据为圆圈添加动画。

第一个变化与我们如何在屏幕上绘制信息有关,并且根本不需要对模型进行任何修改。第二个变化是关于我们必须使用哪些数据,并且根本不需要对视图进行任何更改。您可以轻松地重复使用圆形视图来表示其他类型的数据,或者甚至可能是空气曲棍球比赛中的冰球。它只是一个彩色圆圈。您可以在另一个应用程序中重新使用该模型来处理相同类型的数据。

我确信在这个非常冗长的解释说明中,假设的应用程序与您自己的应用程序几乎没有相似之处,但也许它有助于解释为什么MVC是有用的并告知您自己的结构应用。祝你好运。

+3

谢谢,这真的有帮助。我创建了一个拥有多个不同群众圈子的应用程序。我会设置一定的速度,并使用我编写的一些物理功能来显示球之间的动量碰撞,就像在游戏中一样。他们是免费的飞球相撞,就是这样。我创建这个小应用程序的方式并没有遵循所有的MVC。我来自一个沉重的c/c#背景,并且从未使用过MVC,所以一个例子正是我所需要的。谢谢你的例子,它确实有帮助。 – Dalisto1 2011-03-24 04:51:31

+0

太好了 - 很高兴我能帮上忙。 – Caleb 2011-03-24 06:03:33

4

我从CS193P IPHONE应用程序开发(2013年冬季)得到了很好的解释。

模型 - 视图 - 控制器:

把所有的对象分为三个阵营:

enter image description here

型号:什么您的应用程序是(A卡,甲板,纸牌游戏逻辑)
控制器:如何将模型呈现给用户(UI逻辑)。控制器知道关于UI的所有信息。
查看:您的控制者的奴才

如何将这些营通信:

enter image description here

不要越过黄线。
你可以穿过白色虚线。
有一些特殊的规则用于穿越纯白线。

enter image description here

控制器 - >查看(经由出口
查看 - >控制器(经由数据源(计数,dataAt),代表(将,应,所做的那样), 目标 - 动作
模型 - >位指示(经由通知 & 密钥值观察