首页 > 解决方案 > MVVM 设计模式实现

问题描述

我要求实现MVVM设计模式,所以在这里我有一个HomeViewController

其中包含一个HomeViewModelHomeViewController在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 {


    }


}

标签: iosswiftdesign-patternsmvvmuikit

解决方案


我读到每个 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 概念,当然您可以改进它并根据您的需要采用它,快乐编码!


推荐阅读