【问题标题】:MVVM Design pattern implementationMVVM 设计模式实现
【发布时间】:2020-04-13 22:14:53
【问题描述】:

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

其中包含一个 HomeViewModelHomeViewControllerMVVM 中有一个 tableView 和一些其他 UIKit 组件我读到每个 UIView 都应该有自己的 ViewModel所以对于 UITableView (HomeTableViewCell) 的单元格,每个单元格都应该有自己的 ViewModel ,所以 HomeViewModel 是否应该包含将传递给每个单元格的单元格的 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 {


    }


}

【问题讨论】:

    标签: ios swift design-patterns mvvm uikit


    【解决方案1】:

    我读到每个 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:

    添加一个可选变量来保存视图模型,当视图模型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 概念,当然您可以改进它并根据您的需要采用它,快乐编码!

    【讨论】:

      【解决方案2】:

      我认为您要问的是细胞模型。你可以为你的细胞模型写一个简单的结构。

      struct CellModel {
         let data: Any
      }
      

      那么你的控制器模型可以是

      let controllerData = [DataForCellModels]() 
      

      在基本情况下。

      然后你继承 TableviewCell

      class myCell: UITableViewCell {
          let model: CellModel {
             didSet {
                 updateCell()
             }
          }
      }
      

      要控制您的单元格,这需要您通过 cellID 实现单元格。

      我希望这可以让您了解如何实现它,但有关更多详细信息,我建议您搜索完整的教程。

      祝你的项目好运!

      【讨论】:

        猜你喜欢
        • 2019-08-24
        • 1970-01-01
        • 2011-04-06
        • 2013-08-16
        • 2014-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-12
        相关资源
        最近更新 更多