В моем табличном представлении есть отдельные файлы .xib для ячеек и заголовков. Оба являются подклассами UITableViewCell. Я настроил заголовок, вызвав метод делегата viewForHeaderInSection
UITableViewDelegate, и все работало отлично, пока мне не пришлось добавить кнопку в указанный заголовок.
Я хочу обновлять изображение кнопки после каждого нажатия, но для этого мне нужна ссылка на заголовок, в котором расположена кнопка. Я знаю, что можно получить ссылку на заголовок, вызвав myTableView.headerView(forSection:)
, но этот метод возвращает экземпляр UITableViewHeaderFooterView?
- из-за этого я не могу получить доступ к кнопке заголовка, поскольку приведен из 'UITableViewHeaderFooterView?' к моему пользовательскому подклассу UITableViewCell
всегда терпит неудачу.
Как получить ссылку на заголовок, в котором была нажата кнопка?
Редактировать:
В конце концов, я пошел с ответом @shivi_shub, но вместо добавления цели к кнопке заголовка я использовал закрытие:
В моем настраиваемом классе заголовка (подкласс UITableViewCell) я создал действие и выход для кнопки. Я также добавил дополнительную переменную var expandCompletionHandler: ((UITableViewCell) -> Void)? = nil
. В действии кнопки я передал себя созданному закрытию (expandCompletionHandler (self))
В моем классе ViewController (где находится табличное представление) в viewForHeaderInSection
сразу после настройки представления заголовка я назначил закрытие ранее созданной переменной следующим образом:
header.expandCompletionHandler = {заголовок в if header.expandBtn.tag == section { // Здесь меняем изображение кнопок }
Вам нужно передать HeaderFooterView своему пользовательскому классу.
let headerView = myTableView.headerView(forSection:)
if let = headerView as? MyHeaderViewClass {
headerView.myProperty = someValue
}
Хорошо .. но идеальным сценарием было бы использование самого UITableViewHeaderFooterView.
Я пробовал, но Xcode не позволил мне создать файл .xib с подклассом UITableViewHeaderFooterView. Прочитав несколько вопросов о настраиваемых заголовках представления таблиц (с использованием xibs), многие люди предлагают создать подкласс UITableViewCell. Я предположил, что создание собственного заголовка таким образом было обычной практикой.
добавить Target к кнопке заголовка в методе viewForHeaderInSection -
header.button.tag = section
header.button.addTarget(self, action:
#selector(YourViewController.btnClicked(_:)),
for: UIControlEvents.touchUpInside)
@objc func btnClicked(_ sender: UIButton) {
//check button tag here
}
Это была моя первая мысль сделать именно это, но поскольку мой класс заголовка является подклассом UITableViewCell, я получаю предупреждение, что «Преобразование из 'UITableViewHeaderFooterView' в несвязанный тип 'ExpandableTableViewHeader' (мой класс заголовка) всегда терпит неудачу»