MVVM 正确的 ViewModel 格式创建以在表视图中显示数据 swift iOS

MVVM proper ViewModel format creation to display data in tableview swift iOS

我想创建一个具有适当格式的视图模型,可用于在 tableview 中显示数据。

预期输出:

Expected output screenshot image

我已尝试创建如下所示的视图模型,但无法以正确的格式创建它,而且无法正常工作。

struct MyViewModel {
   var headerlist : [String]
   var listItem : [ListData] {
       get {
           return [ListData(title: "Check Detailed Info", type: .INFORMATION),ListData(title: "Check Document", type: .DOCUMENTS), ListData(title: "Check Policy", type: .DOCUMENTS)]
       }
   }
}
struct ListData {
   var title: String
   var type: HeaderType
}
enum HeaderType {
   case INFORMATION
   case DOCUMENTS
}

如何创建可在如下表视图委托方法中使用的视图模型。

    let viewModel =  MyViewModel()
    func numberOfSections(in tableView: UITableView) -> Int {
        return viewModel.headerlist.count
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let sectionitem = viewModel.headerlist[indexpath.section]
        return sectionItem.listItem.count
    }
    public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        ///Will be creating a headerview and title label outlet in it.
        headerView.titleLabel.text = viewModel?.headerlist[section]
        return headerView
    }

我刚刚找到了一些链接,希望获得正确且易于理解的答案

您有两个部分,因此您的模型中需要两个数组。

我建议你使用这样的东西:

struct SectionData {
    let type: HeaderType
    let items: [String]
}

enum HeaderType {
   case information = "INFORMATION"
   case documents = "DOCUMENTS"
}

struct MyViewModel {

    var sectionData : [SectionData] {
        get {
            return [
                SectionData(type: .information, items: ["Check Detailed Info"]), 
                SectionData(type: .documents, items:["Check Document","Check Policy"])
            ]
        }
    }
}

然后您可以在 table 视图中使用它

let viewModel =  MyViewModel()
    func numberOfSections(in tableView: UITableView) -> Int {
        return viewModel.sectionData.count
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return viewModel.sectionData[section].count
    }
    public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        ///Will be creating a headerview and title label outlet in it.
        headerView.titleLabel.text = viewModel.sectionData[section].type.rawValue
        return headerView
    }

    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: indexPath) -> UITableViewCell? {
        let cell = tableview.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = viewModel.sectionData[indexPath.section].items[indexPath.row]
        return cell
    }

请注意,这不是 MVVM 方法,但您可能出于问题的目的简化了代码。如果您打算使用静态数据,那么在视图模型 init 中创建数据数组会比使用计算 属性.

更有效