Регистрация ячеек UITableView в цикле по значениям перечисления - PullRequest
0 голосов
/ 14 февраля 2019

Регистрация ячеек обычно происходит статическим способом.

Типы элементов 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 голосов
/ 14 февраля 2019

Попробуйте это решение:

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")
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...