tes*_*sla 26 design-patterns mvvm uitableview ios swift
我坚持一个设计决策,为表视图的单元格创建视图模型.每个单元的数据由数据源类(具有数组Contacts)提供.在MVVM唯一的视图模型可以谈的模式,但它没有意义把数据源视图模型,因为这将使得有可能为所有单元存取数据,也这是错误的把数据源视图控制器,因为它必须没有参考数据.还有一些其他关键时刻:
cellForRowAtindexPath 不得放在视图模型中,因为它不应包含任何UI引用什么是为插入MVVM关系中的单元格"插入"数据源的正确方法?谢谢.
Jor*_*tiz 86
让我从一些理论开始.MVVM是Microsoft Silverlight和WPF 的Presentation Model(或Application Model)的专业化.这种UI架构模式背后的主要思想是:
正如您所提到的那样好处:
回到你的问题,UITableViewDataSource协议的实现属于体系结构的视图部分,因为它依赖于UI框架.请注意,为了在代码中使用该协议,该文件必须导入UIKit.另外像方法tableView(:cellForRowAt:)返回一个观点是严重依赖的UIKit.
然后,您的数组Contacts(确实是您的模型)无法通过视图(数据源或其他方式)进行操作或查询.相反,您将视图模型传递给表视图控制器,在最简单的情况下,它具有两个属性(我建议它们存储,而不是计算属性).其中一个是节数,另一个是每节的行数:
var numberOfSections: Int = 0
var rowsPerSection: [Int] = []Run Code Online (Sandbox Code Playgroud)
视图模型使用对模型的引用进行初始化,并且作为初始化的最后一步,它设置这两个属性的值.
视图控制器中的数据源使用视图模型的数据:
override func numberOfSections(in tableView: UITableView) -> Int {
return viewModel.numberOfSections
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return viewModel.rowsPerSection[section]
}Run Code Online (Sandbox Code Playgroud)
最后,您可以为每个单元格设置不同的视图模型结构:
struct ContactCellViewModel {
let name: String
init(contact: Contact) {
name = contact.name ?? ""
}
}Run Code Online (Sandbox Code Playgroud)
而UITableViewCell子类就知道如何使用的结构:
class ContactTableViewCell: UITableViewCell {
var viewModel: ContactCellViewModel!
func configure() {
textLabel!.text = viewModel.name
}
}Run Code Online (Sandbox Code Playgroud)
为了获得每个单元格的相应视图模型,表视图视图模型将提供生成它们的方法,并且可以用于填充视图模型的数组:
func viewModelForCell(at index: Int) -> ContactCellViewModel {
return ContactCellViewModel(contact: contacts[index])
}Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这里的视图模型是唯一与模型(您的Contacts数组)交谈的模型,并且视图仅与视图模型对话.
希望这可以帮助.
Lit*_*hor -6
除非您有一个可以解决的特定问题,否则Model-View-ViewModel尝试仅将其用于“最佳实践”将最终引入许多不必要的复杂性。
您的数据源负责填充您的表。除了您的数据源之外,没有任何东西需要引用,contacts因为它将使用此数据更新您的表。
View Models仅当您需要进行复杂的 UI 交互和更新时才发挥作用。VM 负责封装视图的状态,例如......
当您的视图发生更改时,您View Model有责任对您的视图进行更新(必要时),以反映通过 UIModel对其进行的更改。Model
话虽如此,视图模型在 IOS 中没有意义,因为 IOSView Controllers在设计方法中使用了称为MVC(模型-视图-控制器)的设计方法
| 归档时间: |
|
| 查看次数: |
11209 次 |
| 最近记录: |