通过枚举值循环注册UITableView单元格

时间:2019-02-14 17:57:25

标签: ios swift uitableview

单元格的注册通常以静态方式进行。

元素类型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)
}

我收到以下警告:

  

表达式类型不明确,没有更多上下文

我想找到解决此问题的最佳方法。

1 个答案:

答案 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")
])