单元格的注册通常以静态方式进行。
元素类型UITableViewCell:
enum CustomElementType: String {
case header
case field
case picker
case toggle
case datePicker
}
注册单元格:
tableView.register(CollapsibleTableViewHeader.self, forHeaderFooterViewReuseIdentifier: CustomElementType.header.rawValue)
tableView.register(FieldViewCell.self, forCellReuseIdentifier: CustomElementType.field.rawValue)
tableView.register(PickerViewCell.self, forCellReuseIdentifier: CustomElementType.picker.rawValue)
tableView.register(ToggleViewCell.self, forCellReuseIdentifier: CustomElementType.toggle.rawValue)
tableView.register(DatePickerViewCell.self, forCellReuseIdentifier: CustomElementType.datePicker.rawValue)
我想在一个循环中注册它们,一个近似的语句:
[FieldViewCell.self, PickerViewCell.self, ToggleViewCell.self, DatePickerViewCell.self].forEach { (GenericViewCell) in
tableView.register(GenericViewCell, forCellReuseIdentifier: ?)
}
我认为需要以下结构来解决该问题:
struct Register {
let cell: UITableViewCell
let type: CustomElementType
}
类似这样的寄存器单元:
[Register(cell: FieldViewCell.self, type: .field), Register(cell: PickerViewCell.self, type: .picker), Register(cell: ToggleViewCell.self, type: .toggle), Register(cell: DatePickerViewCell.self, type: .datePicker)].forEach { (RegisterView) in
tableView.register(RegisterView.cell, forCellReuseIdentifier: RegisterView.type.rawValue)
}
我收到以下警告:
表达式类型不明确,没有更多上下文
我想找到解决此问题的最佳方法。
答案 0 :(得分:1)
尝试以下解决方案:
extension UITableView {
func registerCells(_ types: [(AnyObject.Type, String)]) {
for (type, identifier) in types {
self.register(type, forCellReuseIdentifier: identifier)
}
}
func registerHeaderFooterViews(_ types: [(AnyObject.Type, String)]) {
for (type, identifier) in types {
self.register(type, forHeaderFooterViewReuseIdentifier: identifier)
}
}
}
示例:
class FirstCell: UITableViewCell { /*code*/ }
class SecondCell: UITableViewCell { /*code*/ }
class FooterView: UITableViewHeaderFooterView { /*code*/ }
tableView.registerCells([
(FirstCell.self, "identifierOfFirstCell"),
(SecondCell.self, "identifierOfSecondCell")
])
tableView.registerHeaderFooterViews([
(FooterView.self, "identifierOfFooterView")
])