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
中创建数据数组会比使用计算 属性.
更有效
我想创建一个具有适当格式的视图模型,可用于在 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
中创建数据数组会比使用计算 属性.