CollectionModel
这个Pod的目标是提供一个数据结构,以表示collectionView/tableView显示的内容。它使得可以从视图的dataSource中提取任何业务逻辑到负责生成其viewModel的代码部分。这有助于在您的应用程序中执行更好的关注点分离,并使dataSource易于维护。
示例应用程序
为了运行示例项目,请先克隆仓库,然后在示例目录中运行bundle install & bundle exec pod install
。
使用
所有内容均在Xcode中有文档说明。
TableViewViewModel
TableViewViewModel
是一个结构体,尽可能地代表UITableView
的结构。它是两个参数的泛型,分别是HeaderFooterViewModel
和CellViewModel
,这两个参数都很直观,应该代表用于配置tableView单元格、头部或尾部的模型。
该结构体主要是一个数组TableViewSectionViewModel
的包装,而TableViewSectionViewModel
是一个结构体,代表着UITableView
中的一个分区。
TableViewSectionViewModel
依赖于一个cellViewModels
数组以及两个可选的头部和尾部属性。
如果你只使用一种类型的单元格,那么基于CollectionViewModel的实现的tableViewDataSource相当简单。
class SimpleTableViewDataSource: NSObject,
UITableViewDataSource {
typealias ViewModel = TableViewModel<Never, ATableViewCellModel>
var viewModel = ViewModel()
func numberOfSections(in tableView: UITableView) -> Int {
viewModel.sections.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
viewModel[section].cells.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: ATableViewCell = tableView.dequeueCell(at: indexPath)
cell.configure(with: viewModel[indexPath])
return cell
}
}
如果您必须使用多种类型的单元格,则应创建一个用于单元格类型的枚举。
enum MultipleCellTypesTableViewCellModel {
case a(ATableViewCellModel)
case b(BTableViewCellModel)
}
这只需要更改你的tableView(_:cellForRowAt:)
实现,以管理两种单元格类型的情况。
有关更详细的信息,请参阅示例应用。
CollectionViewModel
CollectionViewModel
是一个结构体,尽可能准确地表示了UICollectionView的结构。它是两个泛型参数的泛型结构体:SupplementaryViewModel
和CellViewModel
,这两个参数都是显而易见的,它们应该代表用于配置collectionView单元格的模型或可能是一个头部、尾部或自定义补充视图的补充视图模型。
该结构体主要是一个数组CollectionSectionViewModel
的包装,而CollectionSectionViewModel
是一个结构体,代表着UICollectionView中的一个分区。
CollectionSectionViewModel
依赖于一个单元格视图模型数组和一个字典,该字典存储了补充视图模型,其中键是SupplementaryViewSectionKey
,还有一个索引和补充视图的类型。分区的头部和尾部存储在其自己的变量中,而不是在字典中。
如果你只使用一种类型的单元格,那么基于CollectionViewModel实现的collectionViewDataSource相当简单。
class SimpleCollectionViewDataSource: NSObject,
UICollectionViewDataSource {
typealias ViewModel = CollectionViewModel<Never, CollectionViewCellModel>
var viewModel = ViewModel()
func numberOfSections(in collectionView: UICollectionView) -> Int {
viewModel.sections.count
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
viewModel[section].cells.count
}
func collectionView(_ collectionView: UICollectionView,
cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell: ACollectionViewCell = collectionView.dequeueCell(at: indexPath)
cell.configure(with: viewModel.cellViewModel(at: indexPath))
return cell
}
}
如果您必须使用多种类型的单元格,则应创建一个用于单元格类型的枚举。
enum MultipleCellTypesCollectionViewCellModel {
case a(ACollectionViewCellModel)
case b(BCollectionViewCellModel)
}
这只需要更改你的collectionView(_:cellForItemAt:)
实现,以管理两种单元格类型的情况。
需求
使用此Pod没有技术要求,只是使用Swift。
安装
CollectionModel可以通过CocoaPods获得。要安装它,请简单地将以下行添加到Podfile中:
pod 'CollectionModel'
作者
Denis Poifol,[email protected]
许可证
CollectionModel 在 MIT 许可下可用。请参阅 LICENSE 文件获取更多信息。