Вопрос
Я создаю пользовательский UITableViewCell для повторного использования, а затем создаю его подкласс для повторного использования. Как настроить эти различные подклассы для ссылки на один и тот же файл xib?
Фон
Давайте назовем мой пользовательский UITableViewCell PickerTableViewCell
. Эта ячейка включает UIPickerView
, а также все реализации того, как выглядит и ведет себя окно выбора. Когда я хочу использовать эту ячейку, единственное, что мне нужно дать - это данные для представления выбора. Поэтому я создаю подкласс PickerTableViewCell
, а затем просто создаю нужный источник данных и назначаю его представлению выбора. Пока все это работает хорошо.
Вот соответствующие части PickerTableViewCell
:
class PickerTableViewCell: UITableViewCell {
var picker: UIPickerView! = UIPickerView()
var pickerDataSource: PickerViewDataSource!
override func awakeFromNib() {
super.awakeFromNib()
self.picker = UIPickerView(frame: CGRect(x: 0, y: 40, width: 0, height: 0))
self.picker.delegate = self
self.assignPickerDataSource()
}
// Must be overriden by child classes
func assignPickerDataSource() {
fatalError("Must Override")
}
Вот пример подкласса:
class LocationPickerTableViewCell: PickerTableViewCell {
override func assignPickerDataSource() {
self.pickerDataSource = LocationPickerDataSource()
self.picker.dataSource = self.pickerDataSource
}
}
Задача
Так как я использую эти ячейки повсеместно, с разными источниками данных, я создал файл xib, который определяет, как ячейка выглядит как PickerTableViewCell.xib
, и назначил его классу PickerTableViewCell
. В контроллерах представления, для которых я хочу его использовать, я регистрирую ячейку с табличным представлением внутри viewDidLoad()
. Затем внутри func tableView(_:, cellForRowAt)
я снимаю подкласс, который хочу вот так:
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier") as! LocationPickerTableViewCell
return cell
Вот здесь и возникает проблема. Созданная ячейка - это PickerTableViewCell
, а не ее подкласс LocationPickerTableViewCell
. Это приводит к фатальной ошибке, которую я поместил в родительский класс, который переопределяется дочерним классом.
Единственный способ решить эту проблему - создать отдельный файл XIB для каждого подкласса, который я хочу создать, и назначить его соответствующему подклассу. Хотя это решение действительно работает, неправильно иметь все эти файлы xib, которые практически идентичны (за исключением того, к какому классу они назначены), внутри моего проекта.
Есть ли способ, которым я могу преодолеть эту проблему, и чтобы все эти ячейки ссылались на один и тот же файл xib?
Спасибо! :)