ios 在MVC模式中,什么应该拥有模型?

kninwzqo  于 2023-02-06  发布在  iOS
关注(0)|答案(2)|浏览(118)

假设我在一个SolarSystemView中画一个太阳系(UIView的子类)。SolarSystemView是否应该具有SolarSystem类的示例变量(包含具有所有重要行星和恒星属性的数据结构的类),还是应该属于SolarSystemViewController的示例?还是完全不同的东西?我找不到任何给出满意答案的示例代码。
我想如果视图拥有模型,操作会非常顺利,但这也不是一个好的风格,毕竟,SolarSystem示例必须以某种方式动态变化,并且与SolarSystemView更新的速度相同或相似。

q3qa4bjr

q3qa4bjr1#

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

d4so4syb

d4so4syb2#

在这种情况下,SolarSystemView不应包含SolarSystem类的任何示例。SolarSystemViewController应该是视图(SolarSystemView)和模型(SolarSystem)之间的通道。

相关问题