ios - MVVM 设计模式实现
问题描述
我要求实现MVVM设计模式,所以在这里我有一个HomeViewController
其中包含一个HomeViewModel,HomeViewController在MVVM中有一个 tableView 和一些其他 UIKit 组件我读到每个 UIView 都应该有自己的 ViewModel 所以对于UITableView (HomeTableViewCell)的单元格,每个单元格都应该有自己的 ViewModel ,所以 HomeViewModel 应该包含一个 Collection将传递给每个单元格的单元格的 SubViewModels 或者它的正确实现是什么,最好的方案是什么?
extension HomeViewController : UITableViewDelegate , UITableViewDataSource{
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return viewModel?.articlesCount ?? 0
}
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
}
}
解决方案
我读到每个 UIView 都应该有自己的 ViewModel
你是对的,但请记住,越来越深入地观察每个UIKit
组件的 MVVM 可能会变得复杂并且需要很多时间!所以我的建议是始终考虑项目情况和截止日期。
另外,我建议你有代码风格。阅读它们,例如在您的代码中注意到您的类名以小写字母开头myCell
,这并不常见。
回答你的问题:
记住这一点:UITableViewCell
不应该被模型访问。
为 MyCell 添加新的视图模型:
这是处理自定义 tableViewCell 逻辑和数据的基本视图模型。
class MyCellViewModel {
private let model: CellModel
init(model: CellModel) {
self.model = model
}
}
// properties TableViewCell needs.
extension MyCellViewModel {
var title: Any {
return model.title
}
var someImage: Any {
return model.image
}
// add variables or functions...
}
更新自定义 UITableViewCell、MyCell:
添加一个可选变量来保存 viewModel 并在查看模型didSet
时更新视图。
class myCell: UITableViewCell {
var viewModel: MyCellViewModel? {
didSet {
guard let viewModel = viewModel else { return }
// just an example
titleLabel.text = viewModel.title
}
}
}
在 HomeViewController 的 View Model 中添加:
现在我们需要UITableViewCell
从控制器的视图模型中传递自定义的视图模型。
func viewModelForCell(atIIndexPath: IndexPath) -> MyCellViewModel {
return MyCellViewModel(model: articles[indexPath.row])
}
这个基本实现只是为了展示避免视图访问模型和处理视图模型中的所有逻辑过程的 MVVM 概念,当然您可以改进它并根据您的需要采用它,快乐编码!
推荐阅读
- elasticsearch - 如何绘制 kibana 中特定字段的 _exists 与 NOT _exists 比率的时间直方图?
- c# - 将本地资源(css、js、图像)加载到 Xamarin 中的 WebView 源
- css - 如何对齐框内的文本?
- php - 如何在 PHP 中选择数据库 mysqli 表中的复选框
- android - 如何从android中的ansys任务“doInBackground”获取列表数组?
- generics - 在 asp.net .core 中使用泛型类型时无法解析已实现的对象
- javascript - 在 ReactJS 中的地图内循环数组索引
- c++ - 如何正确调用对齐的新/删除?
- php - 如何在 mysql 中获取最后插入的 id 并将其插入到另一个表中?
- javascript - 将值保存到 Chrome 扩展中的文本框