我想创建一个具有适当格式的视图模型,用于显示tableview中的数据。
预期输出:
预期输出屏幕截图图像
我试着创建一个视图模型,如下所示,但我无法以正确的格式创建它,它也不起作用。
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
}
我刚刚发现了一些链接,希望得到正确的可理解的答案
使用Swift 的带有MVVM的UITableView
使用MVVM 将数据填充到UITableView
TableView单元格中的MVVM
您有两个部分,因此您的模型中需要两个数组。
我建议你使用这样的东西:
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"])
]
}
}
}
然后你可以在你的表视图中使用它
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
中创建数据数组会比使用计算属性更有效。