gpt4 book ai didi

ios - 在 ViewModel 中格式化 UITableViewCell 日期

转载 作者:行者123 更新时间:2023-11-28 05:59:19 24 4
gpt4 key购买 nike

我正在设置一个 TableView,想知道用 viewModel 设置 UITableViewCells 的正确方法是什么。

假设我有一个模型:

class Item {
var date: Date!
var info: String?
}

我的主 ViewController 的 viewModel 有一个属性,它是一个 Item 对象数组。

  1. 我已经声明了单元格 View 模型的协议(protocol)。它是否应该包含 var date: Stringvar info: String 之类的属性(带有 Item 初始值设定项,所以基本格式化的数据将显示在单元格内)或者我应该将 Item 对象保留在这里?
  2. 谁负责格式化单元格中的日期?我假设单元格的 View 模型对此负责,但另一方面,在每个 ViewModel 中都有 dateFormatter 实例是否有效?也许从另一个类传递日期格式化程序并只保留一个引用会更好?

我的主viewController(与tableView相关的方法)

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCell(withIdentifier: "itemCell", for: indexPath) as? ItemTableViewCell

cell?.viewModel = viewModelForCell(at: indexPath.row)
cell?.setupCell()
return cell ?? UITableViewCell()
}

private func viewModelForCell(at index: Int) -> ItemTableViewCellRepresentable {

let item = viewModel?.items[index]
if let item = item {
return ItemTableViewModel(item: item, formatter: viewModel.cellDateFormatter)
}
return ItemTableViewModel()
}

cell 的 viewModel 协议(protocol):

protocol ItemTableViewCellRepresentable {
var date: String { get }
var info: String? { get }

init(item: Item, formatter: DateFormatter)
}

单元格的 viewModel 类:

class ItemTableViewModel: ItemTableViewCellRepresentable {

var date: String
var info: String?

required init(item: Item, formatter: DateFormatter) {
self.date = formatter.string(from: item.date)
self.info = item.info
}

init() {
self.date = ""
self.info = ""
}

}

还有我的手机:

(...)

var viewModel: ItemTableViewCellRepresentable?

func setupCell() {
guard let viewModel = viewModel else {
return
}

dateLabel.text = viewModel.date
descriptionLabel.text = viewModel.info ?? "no info"
}

最佳答案

你的 ViewModel 协议(protocol)应该有 Representable 信息,将显示以查看 MVVM 的概念,ViewModel 只是给出他的 View 信息只显示

所以像这样安排你所有的 MVVM :

型号:

只是用来将json映射到数据模型而已

class Item {
var date: Date!
var info: String?
}

CellRepresentable :

View 所需的所有内容,单元格需要 dateinformation 作为 String

protocol ItemTableViewCellRepresentable {
var date: String { get }
var info: String? { get }
init(item: Item)
}

View 模型:

所有逻辑、API 调用(日期格式等)

ItemTableViewModel 必须引用 Model 。在 MVVM ViewModel 中处理模型

class ItemTableViewModel: ItemTableViewCellRepresentable {

var item:Item

var date: String {
return item.date.getItemFullDate()
}

var info: String? {
return item.info
}

required init(item: Item) {
self.item = item
}
}

也在你的 MainViewController

相反,您必须在 Maincontroller private func viewModelForCell(at index: Int) ->

中将项目转换为 cellViewModel

只需移至 MainViewModel 即可将其转换为 CellRepresentable

所以在你的 MainViewController 中 ViewModel 应该是这样的

class MainViewModel{

var dataSource:[CellRepresentable] = [CellRepresentable]()


func getDataFromAPI( _ completion:(()->() ){
// Update Data Source
// there use map to convert Items to CellRepresentable and append to
datasourec array
}
}

对于 DatFormatter 最好使用 General extension to Handel this for you

protocol Dateable {
func getItemFullDate() -> String
func getItemHours() -> String
}

extension Date: Dateable {
var formatter: DateFormatter { return DateFormatter() }

/** Return a Item FullDate */
func getItemFullDate() -> String {
// Customize a date formatter
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
formatter.timeZone = TimeZone(abbreviation: "UTC")

return formatter.string(from: self)
}

/** Return a item shor Time hour */
func getItemHours() -> String {
// Customize a date formatter
formatter.dateFormat = "HH:mm"
formatter.timeZone = TimeZone(abbreviation: "UTC")

return formatter.string(from: self)
}

// You can add many cases you need like string to date formatter

}

关于ios - 在 ViewModel 中格式化 UITableViewCell 日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50305344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com