在 MVC 范式中,模型应该与视图分离。为了获取它需要自己绘制的数据,它向 Controller 请求它,而后者又向 Model 请求它。这样,我们将信息与 GUI 分离。如果有帮助,可以将其视为模型控制器视图。因此,在大多数情况下,控制器“拥有”模型。
例如,在 cs193p 中,CalculatorViewController
(Controller) 具有CalculatorBrain
(Model) 属性,它与之交互以获取方程式的结果以显示在视图中。
在您的特定示例中, theSolarSystemViewController
可能对 有一个强引用SolarSystem
,它会轮询它将移交的数据,SolarSystemView
以便它可以在需要更新时自行绘制。还可能在用户与其交互时SolarSystemView
通知SolarSystemViewController
,以便它可以显示其他视图或更新SolarSystem
,以及它可以执行的任何其他任务。
请注意,Cocoa 和 Cocoa Touch 中的 MVC 范例与其他更通用的 MVC 版本(如 Smalltalk)略有不同。例如,如果您查看MVC 上的 Wikipedia 页面,那里的图表应该与您所学的有所不同。事实上,GoF(设计模式)就是这样描述 MVC 的。
MVC 由三种对象组成。模型是应用程序对象,视图是它的屏幕呈现,控制器定义了用户界面对用户输入的反应方式。在 MVC 之前,用户界面设计倾向于将这些对象集中在一起。MVC 将它们解耦以增加灵活性和重用性。MVC 通过在它们之间建立订阅/通知协议来解耦视图和模型。视图必须确保其外观反映模型的状态。每当模型的数据发生变化时,模型都会通知依赖它的视图。作为响应,每个视图都有机会进行自我更新。这种方法允许您将多个视图附加到模型以提供不同的表示。您还可以为模型创建新视图而无需重写它。
在这两种情况下,模型本身都在联系视图以更新它。但是,在 iOS 上,Model 和 View 之间的交互是通过 Controller 处理的。这在cs193p 的第一个会话以及Apple 自己的 MVC 关系文档中得到了很好的解释。这样,您只需要重写控制器代码即可在其他地方重用模型和视图。
这是来自 cs193p 的 MVC 图来澄清。