2013-03-16 35 views
7

自从我记得以来,我一直在制作iOS应用程序,但直到最近才有实习编程,我的编程风格还没有很成熟。我很早就学会了许多面向对象的概念,因为我意识到生活中对他们的理解吸引了很多,但是我从来没有学过的东西是MVC模式。什么应该拥有MVC模式中的模型?

为了给出上下文,假设我在单个SolarSystemViewUIView的一个子类)内绘制太阳系。我的SolarSystemView是否有一个SolarSystem类的实例变量(一个包含具有所有重要行星和stelar属性的数据结构的类),还是应该属于SolarSystemViewController的实例?或者是完全不同的东西?我找不到任何示例代码可以给出满意的答案。

我想如果视图拥有模型,操作将会非常流畅,但是这也不会让你感觉像样式不错。毕竟,SolarSystem实例必须以某种方式动态更改,并且具有与SolarSystemView更新相同或相似的速率。

回答

5

在MVC范例中,模型应该与View分离。为了获取需要绘制的数据,它会向控制器询问数据,然后再向模型请求它。这样,我们就可以从GUI中分离信息。把它看作模型控制器查看是否有帮助。因此,在大多数情况下,财务主任“拥有”该模式。

例如,在cs193p中,CalculatorViewController(控制器)具有CalculatorBrain(模型)属性,它与其交互以获取方程结果以显示在视图中。

在您的具体示例中,SolarSystemViewController可能会强烈参考SolarSystem,它将轮询数据以便它将交给SolarSystemView,以便它可以在需要更新时自行绘制。 SolarSystemView也可能在用户与其交互时通知SolarSystemViewController,以便它可以显示其他视图或更新SolarSystem以及它可以执行的任何其他任务。

请注意,Cocoa和Cocoa Touch中的MVC范例与其他更广义的MVC有点不同,如Smalltalk。例如,如果你看看Wikipedia page on MVC,那么图表应该与你学习的内容看起来不同。事实上,GoF(设计模式)如此描述MVC。

MVC由三种对象组成。该模型是应用程序 对象,视图是其屏幕演示文稿,并且控制器定义了用户界面对用户输入的反应方式。在MVC之前,用户界面设计倾向于将这些对象结合在一起。 MVC 将它们分离以增加灵活性和重用性。 MVC通过在它们之间建立订阅/通知协议来解耦视图 和模型。视图必须确保其外观反映模型的状态。 只要模型的数据发生变化,模型就会通知 依赖于该视图。作为回应,每个视图都有机会更新 本身。这种方法可让您将多个视图附加到模型上,以提供不同的演示文稿 。您也可以为 模型创建新视图,而不必重写它。

在这两种情况下,模型本身正在联系视图以更新它。但是,在iOS上,Model和View之间的交互是通过Controller来处理的。这在first session of cs193p以及Apple's own documentation on MVC relationships.中有很好的解释。这样,您只需要重写Controller代码就可以在别处重新使用模型和视图。

这是来自cs193p的MVC图解释。

Model View Controller

+0

这完全覆盖了我所问的;我有一个额外的调查。应该做什么“滴答”?显然需要为行星继续前进打个勾。如果我理解正确,那将是拥有一个计时器的控制器,此时它会要求模型改变,然后从模型中检索数据并将其显示在屏幕上,对吧?这可能是一个单独的问题的内容。 – 2013-03-19 13:33:30

+0

@CarterPape是的,这听起来对我来说是正确的。控制器通常会处理对模型的更新,然后通知依赖它进行更新的视图。例如,一个游戏的运行循环会存在于Controller中,并且每一帧都会通知游戏中的代理(Model)自行更新,然后通知View(例如GLKView)自行更新。 – Metabble 2013-03-19 17:37:25

0

在这种情况下,SolarSystemView不应包含SolarSystem类的任何瞬间。 SolarSystemViewController应该放在你的视图(SolarSystemView)和模型(SolarSystem)之间。

相关问题