Повторно используемые ячейки UITableView не перестраиваются должным образом
У меня есть контроллер табличного представления со связанным tableView. Ячейки в этом списке также содержат tableViews, или, более конкретно, ячейка имеет tableView, и каждый экземпляр ячейки использует встроенный tableView для отображения немного другого списка имен. Вот схема:
- родительский tableView
- __tableViewCell
- ____ встроенный просмотр таблицы
- ______name1 (в ячейке)
- ______name2 “
- ______name3 “
Контроллер представления для встроенного tableView отсутствует. Делегат и dataSource отображаются на встроенный класс tableView. Это все на основе раскадровки.
В симуляторе эта настройка прекрасно работает для первых нескольких ячеек, отображаемых в списке - каждая отображает свой собственный список имен - но после четвертой или пятой ячейки (да, я несколько раз прокручивал за пределами экрана), ячейки по-прежнему отображаются, но они не генерируются встроенным табличным представлением; у них есть старые и неправильные списки имен. В этот момент нет вызовов ни awakeFromNib, ни initWithCoder для встроенного tableView (оба из которых вызываются для успешно отображаемых ячеек).
Это подразумевает (для меня), что родительский tableView (тот, которому принадлежат ячейки, у которых есть встроенные tableViews) повторно использует ячейки, которые он вытягивает из списка повторного использования. Это поднимает некоторые вопросы:
Почему он не пытается восстановить клетки? В tableView родительского tableView:cellForRowAtIndexPath я получаю ячейку и заполняю ее некоторой информацией (например, в ячейке также есть UILabel, чтобы я мог ее идентифицировать) и новым содержимым для этого, но встроенной частью tableView клетка НЕ перестраивается.
Если это случай повторного использования ячеек, извлеченных из некоторого кэша, как я могу пометить каждый кэшированный элемент как "грязный", чтобы он был восстановлен? Мне известно о tableView:didEndDisplayingCell:forRowAtIndexPath: но я не знаю, как его использовать для восстановления. Например, я попытался удалить ячейку (то есть cell = nil), но это не помогло (я сделал это как для родительского tableView, так и для встроенного tableView).
В обсуждении prepareForReuse (которое я не пробовал, поскольку хочу изменить больше, чем атрибуты) говорится: "Делегат табличного представления в tableView:cellForRowAtIndexPath: должен всегда сбрасывать все содержимое при повторном использовании ячейки. Если объект ячейки не имеет ассоциированного идентификатора повторного использования, этот метод не вызывается. Если вы переопределите этот метод, вы должны обязательно вызвать реализацию суперкласса ". Это именно то, что я пытаюсь сделать, но встроенный tableView каким-то образом избегает этого (возвращаясь к вызову ни awakeFromNib, ни initWithCoder.
Спасибо.