我有一个应用程序,我希望有一个“背景”视图(视图控制器视图),最重要的是,多个UIView
将自己绘制为圆圈。我只是不明白如何在坚持MVC的同时实现所有这些......
模型和视图应该不同。这是否意味着我通常需要一组用于视图的头文件和实现文件以及另一个(单独的)模型集 - 即使我的对象只是一个Circle
类?或者,我会设置一个Circle.h
和Circle.m
,然后在头文件中有两个接口块,一个用于模型,一个用于视图,以及两个实现块(同样,一个用于模型和一个视图)?
我见过一些人建议使用视图控制器来处理loadView
中的所有视图,并避免创建单独的自定义视图对象;这是否意味着我不应该为视图创建一组单独的.h
和.m
文件?对我来说,后者在设计方面看起来更有条理。
另外,如果我要让视图控制器处理多个视图对象和多个模型对象,我会将它们存储在控制器中的两个数组中 - 一个用于模型,另一个用于视图。对?我的问题是:当我在每个模型上使用键值观察时,对于每个模型对象,我将如何更改正确的相应视图对象(假设两个数组中的两个对象的索引都不相同)?
我正在考虑使用指向视图内部的模型对象的指针,以及从视图到模型的KVOing - 但是它不会通过控制器从而完全打破MVC,对吧?
提前谢谢。
答案 0 :(得分:23)
MVC是一个大而广泛的想法。它更像是一种指导哲学,而不是一种特定的规则,并不总是以同样的方式实施。阅读Apple's discussion of MVC以了解Cocoa中传统MVC和MVC之间的区别。
很难说如何将MVC应用到您的应用中,因为您还没有告诉我们该应用应该做什么,而且它听起来不像是一个真实的应用程序。所以我会在这里尽力而为,并在此过程中做出一些假设。一个只在背景上的固定位置绘制一堆圆圈的应用程序并不是很有趣 - 它几乎可以是所有视图,几乎不需要任何控制器。因此,我们可以说圆圈都在不同的方向上移动,以不同的颜色绘制,并随着时间的推移而改变大小。现在您开始需要一个模型,以便您可以跟踪这些圆圈所代表的数据,以及一个控制器,将模型转换为可由视图表示的术语。
由于您专门询问了绘制圆圈,让我们从视图开始。在给定必要参数的情况下,拥有一个知道如何绘制圆的自定义视图似乎是个好主意:区域,颜色和位置。你可能会制作这些东西属性,并覆盖-drawRect:这样它就会以给定的颜色绘制给定区域的圆圈。
我们不知道这些圈子代表什么,但如果它们不代表什么就没有多大乐趣,所以让我们假设应用程序的工作是帮助我们比较公司。我们有关于收入,市值,员工数量,信用评级,名称,股票代码等的数据。您可以创建一个自定义对象来存储每个公司的所有数据,或者您可以将它们全部放在字典中。我们的模型是一组这些自定义对象或词典。
请注意,圆圈视图对公司一无所知,模型对圆圈一无所知。这是一件好事。它也是控制器的用武之地。控制器是您使用视图直观地表达模型的代码。它还解释视图中的事件,并根据需要更新模型。因此,我们的控制器知道公司的细节以及圆形视图的属性。它为模型中的每个公司创建一个圆形视图。我希望圆圈区域对应于公司的市值,表示收入的垂直位置和表示员工数量的水平位置。我们将根据公司的信用评级指定颜色。当然,控制器应该跟踪所有圆形视图以及在圆形视图和公司之间进行映射的某种方式。
现在你有了一些东西。它仍然是一个非常简单的应用程序,但你有一个有用的图表来比较几个方面的公司。让我们改进它。
首先,很难知道哪个圈子代表哪个公司。如果圆形视图可以选择显示一些文本,那将是很好的。让我们添加标题和副标题属性,并修改-drawRect:分别在圆圈的上方和下方绘制这些字符串。我们还将更改控制器,以便点击一个圆圈,将该圆圈的标题和副标题设置为公司的名称和股票代码,或者如果之前已设置,则清除它们。
其次,在某个时刻比较公司很好,但如果我们能够随着时间的推移显示变化,那就更有趣了。让我们更改模型,包括收入,市值,员工和评级的历史数据。我们可以更新控制器,以便它可以使用历史数据为圆圈设置动画。
第一个变化与我们如何在屏幕上绘制信息有关,并且根本不需要对模型进行任何修改。第二个变化是关于我们必须使用哪些数据,并且根本不需要对视图进行任何更改。您可以轻松地重复使用圆形视图来表示其他类型的数据,或者甚至可能成为空气曲棍球比赛中的冰球。这只是一个彩色圆圈。您可以在另一个处理相同类型数据的应用程序中重用该模型。
我确信这个非常冗长的解释中的假设应用程序与您自己的应用程序几乎没有相似之处,但也许它有助于解释为什么MVC是有用的并告知您自己的应用程序的结构。祝你好运。
答案 1 :(得分:4)
我从CS193P IPHONE应用程序开发(2013年冬季)得到了很好的解释。
模型 - 视图 - 控制器:
将所有物品分成三个阵营:
型号:你的应用程序是什么(A卡,甲板,纸牌游戏逻辑)
控制器:如何您的模型呈现给用户(UI逻辑)。 Controller知道UI的一切。
查看:您的控制器的奴才。
这些营地如何沟通:
不要越过黄线 你可以越过虚线白线 有一些特殊规则可用于穿越纯白线。
控制器 - >查看(通过插座)
查看 - >控制器(通过数据源(计数,dataAt),委托(将,应该,已做),目标行动)
型号 - >控制器(通过通知& 键值观察)