了解模型 - 视图 - 控制器

Dal*_*to1 13 model-view-controller objective-c ios

我有一个应用程序,我想有一个"背景"视图(视图控制器视图),最重要的是,多个UIViews绘制自己作为圆圈.我只是不明白如何在坚持MVC的同时实现所有这一切......

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

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

此外,如果我有多个视图对象和视图控制器处理的多个模型对象,我会将它们存储在控制器中的两个数组中 - 一个用于模型,另一个用于视图.对?我的问题是:当我在每个模型上使用键值观察时,对于每个模型对象,我将如何更改正确的相应视图对象(假设两个数组中的两个对象的索引都不相同)?

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

先感谢您.

Cal*_*leb 23

MVC是一个大而广泛的想法.它更像是一种指导哲学,而不是一种特定的规则,并不总是以同样的方式实施.阅读Apple对MVC的讨论,以了解Cocoa中传统MVC和MVC之间的区别.

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

由于您具体询问了绘制圆圈,让我们从视图开始.在给定必要参数的情况下,拥有一个知道如何绘制圆的自定义视图似乎是个好主意:区域,颜色和位置.您可能会创建这些属性,并覆盖-drawRect:这样它会以给定颜色绘制给定区域的圆.

我们不知道这些圈子代表什么,但如果它们不代表什么就没有多大乐趣,所以让我们假设应用程序的工作是帮助我们比较公司.我们有关于收入,市值,员工数量,信用评级,名称,股票代码等的数据.您可以创建一个自定义对象来存储每个公司的所有数据,或者您可以将它们全部放在字典中.我们的模型是一组这些自定义对象或词典.

请注意,圆圈视图对公司一无所知,模型对圆圈一无所知.这是一件好事.它也是控制器的用武之地.控制器是您使用视图直观地表达模型的代码.它还解释视图中的事件,并根据需要更新模型.因此,我们的控制器知道公司的细节以及圆形视图的属性.它为模型中的每个公司创建一个圆形视图.我希望圆圈区域对应于公司的市值,表示收入的垂直位置和表示员工数量的水平位置.我们将根据公司的信用评级指定颜色.当然,控制器应该

现在你有了一些东西.它仍然是一个非常简单的应用程序,但是你有一个有用的图表来比较几个方面的公司.让我们改进吧.

首先,很难知道哪个圈子代表哪个公司.如果圆形视图可以选择显示一些文本,那将是很好的.让我们添加标题和副标题属性,并修改-drawRect:分别在圆圈的上方和下方绘制这些字符串.我们还将更改控制器,以便点击圆圈或将圆圈的标题和副标题设置为公司的名称和股票代码,或者如果先前已设置则清除它们.

其次,在某个时刻比较公司是很好的,但如果我们能够随着时间的推移显示变化,那就更有趣了.让我们更改模型,包括收入,市值,员工和评级的历史数据.我们可以更新控制器,以便它可以使用历史数据为圆圈设置动画.

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

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

  • 谢谢,这真的有帮助.我创建了一个具有不同质量的多个圆圈的应用程序.我会设置一定的速度并使用我编码的一些物理函数来显示球之间的动量碰撞,就像在游泳池中一样.他们是碰撞的自由飞球,就是这样.我创建这个小应用程序的方式并没有遵循所有的MVC.我来自一个沉重的c/c#背景,并且从未使用过MVC,所以一个例子正是我所需要的.谢谢你的例子,这真的很有帮助. (3认同)