MVVM-Swift 5.0.2

MVVM-Swift 5.0.2

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最新发布2024年3月
SPM支持 SPM

Dai Ho V.Dai Ho V. 维护。




  • Dao Nguyen V.

pod build codecov codebeat

想法

MVVM 是针对 Microsoft's Silverlight 和 WPF 的 Presentation Model(或 Application Model)的特化。这种 UI 架构模式背后的主要思想是

  • 视图部分是唯一一个依赖于 GUI 框架的部分。这意味着对于 iOS,视图控制器是视图的一部分。
  • 视图只能与视图模型通信,而不能与模型通信。
  • 视图模型持有视图的状态。这种状态通过视图模型的属性提供给视图。这些属性包含不仅仅是标签的值,还包括其他与视图相关的信息,如保存按钮是否启用或评分视图的颜色。但是状态信息必须是 UI 框架无关的。所以在这种情况下,颜色属性应该是一个枚举,例如,而不是一个 UIColor。
  • 视图模型还提供了将处理 UI 操作的方法。这些操作将与应用程序模型通信,但它们永远不会直接改变与数据相关的视图状态。相反,它们将与模型通信并请求所需的变化。
  • 模型应该是 自主的,也就是说,您应该能够为命令行应用程序和 UI 界面使用相同的模型代码。它将处理所有业务逻辑。
  • 模型不知道视图模型。因此,视图模型的变化是通过观察机制传播的。对于 iOS 和具有 plain NSObject 子类或甚至 Core Data 的模型,可以使用 KVO 来实现这一点(也对 Swift 可用)。
  • 一旦视图模型了解到模型的变化,它应该更新它持有的状态(如果您使用值类型,则应创建一个新的更新版本并替换它)。
  • 视图模型不清楚视图的存在。在其原始构思中,它使用数据绑定,这在iOS上不可用。因此,视图模型中的更改通过观察机制进行传播。您也可以在此处使用KVO,或者如您在问题中提到的,一种简单的委托模式,如果能结合Swift属性观察器就更好了。有些人更喜欢响应式框架,如RxSwiftReactiveCocoa,甚至是Swift Bond

特别感谢Jorge Ortiz

优点

  • 视图模型是可测试的。由于它们不需要视图来完成工作,因此可以无需任何UI自动化或存根来测试表示行为。
  • 视图模型可以像模型一样使用。如果需要,视图模型可以像域模型一样复制或序列化。这可以用于快速实现UI恢复和其他类似行为。
  • 视图模型(大部分)是平台无关的。由于实际的UI代码位于视图中,因此精心设计的视图模型可以在iPhone、iPad和Mac上使用,只需对每个平台进行细微调整。
  • 视图和视图控制器更加简单。一旦将重要逻辑移动到其他地方,视图和VC变成简单的UI对象。这使得它们更容易理解和重新设计。

交互器

视图模型包含什么内容?

视图模型就像模型的一个适配器,使其适用于表示。视图模型也是将表示行为放入的地方。

例如,视图模型可能处理

  • 启动网络或数据库请求
  • 确定何时隐藏或显示信息
  • 日期和数字格式
  • 本地化

然而,视图模型不负责实际呈现信息或处理输入——这是视图层的专有领域。当视图模型需要将某事告知视图时,它通过数据绑定系统来完成。

视图包含什么内容?

OS X和iOS都拥有视图(或窗口)控制器,乍一看可能有些令人困惑,因为MVVM只指代视图。

但仔细观察后,可以清楚地看出视图控制器实际上是视图层的一部分,因为它们处理诸如

  • 布局
  • 动画
  • 设备旋转
  • 视图和窗口过渡
  • 显示加载的UI

所以,“视图”实际上指的是视图层,它包括视图控制器。但同一屏幕部分没有必要既要有视图又要有视图控制器——只需选择适用于当前用例更简单的任何一个类。

无论您决定使用视图还是视图控制器,您仍然需要一个视图模型。