Изменение высоты
Итак, в основном, есть два способа сделать это:
Первый - фактически перезагрузить ячейку (а не таблицу). Перезагрузка вызовет новый heightForRow (не забудьте очистить кеш, если вы кешируете размеры), который вернет правильную новую высоту:
let indexPaths = [NSIndexPath(forRow: ~the rows in question~, inSection: 0)]
self.table.reloadRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic)
(Обратите внимание, однако, что это часто включает перезагрузку более одной строки; особенно если вы выбираете/отменяете выбор, вам нужно перезагружать все измененные строки.)
Однако, если вы ТОЛЬКО хотите изменить размер ячейки и содержимое как таковое и на самом деле не изменили содержимое данных... например:
вы нажали какую-то кнопку и назначили новый локальный текст в ячейке для розеток (возможно, текст справки):
вы изменили только МАКЕТ ячейки. например, вы увеличили шрифт или изменили поле блока текста, чтобы изменилась высота блока текста, поэтому изменилась высота всей ячейки:
В этом случае вместо перезагрузки просто вызовите следующее, что заставляет табличное представление в основном выполнять все анимации, и для этого ему нужны новые высоты, поэтому оно запрашивает это:
self.table.beginUpdates()
self.table.endUpdates()
Верное решение
Я вижу, в чем твоя проблема. Вы пытаетесь изменить высоту ячейки от фактической ячейки - но у вас это не получится -> и вы не должны. Видите ли, ячейка — это представление, а представление не должно иметь никакого представления о своих данных — представление — это то, что представляет. Если вам нужны какие-либо изменения, вы должны сообщить об этом своему контролеру. Для этого можно использовать уведомления, но желательно протоколы/делегаты.
Итак, сначала вы создаете протокол в своей ячейке, который будет использоваться для информирования контроллера о том, что произошло изменение:
protocol MyCellDelegate {
func buttonTappedForCell(cell : UITableViewCell)
}
Теперь вам нужно соответствовать этому протоколу в вашем контроллере представления, который содержит таблицу:
class MyClassWithTableView : MyCellDelegate
Наконец, вам нужно объявить делегата в ячейке:
class MyCell {
var delegate : MyCellDelegate
}
И назначить его в конфигурации ячейки, которая у вас наверняка есть в контроллере представления:
cell.delegate = self
На самом деле это базовая настройка для всех делегатов/протоколов, и теперь, когда вы нажимаете на свою кнопку, вы можете перенаправить действие на свой контроллер:
@IBAction myButtonTouchUpInside() {
self.delegate.buttonTappedForCell(self)
}
После всего этого действуйте, как в части 1. То есть либо reloadRowsAtIndexPaths
, либо пара beginUpdates
/endUpdates
, как описано выше.
Надеюсь, поможет!
person
Jiri Trecak
schedule
22.09.2015