Swift语言很棒,但有时与UIKit协同工作时可能没有安全网。
我的cell provider实现满足以下要求:
我实际上在很久以前为我的另一个库Populate编写了这段代码。
Populate还包括处理table/collection视图数据的更一致的API。包括类型安全,通过简单的Swift数组的NSFetchedResultsController-like绑定,value类型的支持,分节,排序,等等。
// First register your cell
tableView.register(cellClass: PersonCell.self)
// Then dequeue with a type-safe function
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let person = people[indexPath.item]
if person.role == "Engineer" {
let cell = tableView.dequeueReusableCell(ofType: PersonCell.self, for: indexPath)
cell.textLabel?.text = person.name
cell.detailTextLabel?.text = person.role
return cell
} else {
let cell = tableView.dequeueReusableCell(with: "SubtitleCell", for: indexPath) as UITableViewCell
cell.textLabel?.text = person.name
cell.detailTextLabel?.text = person.role
return cell
}
}
实现多类型安全的cell处理的关键是ResuableView
和ReusableViewHosting
协议扩展。它可以自动为您处理所有注册/队列操作——并且完全不需要字符串类型标识符。
此仓库包含一个简单的示例项目供您方便使用,但是为了使用代码,只需将CellProvider.swift
复制到您的项目中即可。
或者您可以从GIST获取代码,ReusableView.swift
以下平台和版本已进行测试:
所有代码均可在MIT许可证下获取。