Как удалить ячейки, которые можно повторно использовать в UITableView (MonoTouch) - PullRequest
1 голос
/ 07 ноября 2011

У нас есть сценарий, в котором мы повторно используем один и тот же UITableView для отображения разных наборов записей из базы данных, когда пользователь выбирает элемент в другом UITableView (аналогично по концепции разделенному контроллеру, но все в одном представлении).

Когда пользователь выбирает другую область для просмотра, мы выбираем соответствующие записи из базы данных, обновляем источник новым набором записей и вызываем ReloadData.

Проблема заключается в том, что некоторые ячейки в UITableView все еще существуют и используются повторно при переключении между списками, что приводит к неверным или перекрывающимся данным для различных строк.

У меня вопрос: есть ли способ, с помощью которого мы можем сказать UITableView отбросить все существующие ячейки, включая те, которые поставлены в очередь для повторного использования? Я ожидал, что ReloadData выполнит эту задачу, но это не так.

Обновление с дополнительными уточнениями:

Каждая ячейка в нашей таблице состоит из переменного количества подпредставлений (мы пытаемся имитировать элемент управления сеткой). Когда пользователь выбирает другой список в левой навигационной панели, нет гарантии, что позиции (столбцы) подпредставления в новом выбранном списке будут совпадать с позициями в предыдущем списке. Вот почему мы ищем метод удаления ячеек из очереди.

Ответы [ 3 ]

1 голос
/ 07 ноября 2011

Поскольку в такой ситуации могут оказаться другие, я опубликую решение, которое мы использовали, но все еще интересуюсь более «родными» способами сделать это.

Вот как мы решилипроблема:

Когда изменяется отображаемый набор записей, мы обновляем UITableView уникальным идентификатором для текущей конфигурации ячейки (то есть, какой список данных просматривает пользователь в данный момент).

Затем мы создали пользовательскую версию UITableViewCell и записали уникальный идентификатор списка в ячейке при ее создании.

Когда мы снимаем очередь с многоразовой ячейки, мы сравниваем текущий уникальный идентификатор представления с уникальным идентификатором, хранящимся в ячейке.и, если они не совпадают, мы отбрасываем ячейку и создаем новую.

Надеемся, это поможет кому-то в будущем.

0 голосов
/ 07 ноября 2011

Ваш метод GetCell должен гарантировать, что ячейка, находящаяся в очереди, полностью настроена с новыми данными, которые она собирается отобразить.

Распространенной ошибкой является допущение, что простое удаление ячейки для отображения даст вам новую ячейку, которую вы можете использовать.

Если вы выполнили какую-либо настройку для своей ячейки, например добавили представления, изменили ее свойства (изображения, индикаторы раскрытия, цвета фона), вы должны убедиться в методе GetCell, который повторно использует ячейку, что каждое из этих свойств правильно настроен перед возвратом ячейки.

0 голосов
/ 07 ноября 2011

ReloadData не очищает очередь повторного использования.Он просто запускает обратные вызовы для повторного чтения данных, которые перезагружают строки.По мере загрузки каждой ячейки, если вы выводите ее из очереди повторного использования, она все равно будет использоваться.Это хорошо, даже если табличное представление используется повторно, потому что типы ячеек одного типа, тем более что вы используете CellIdentifier для обеспечения этого.

Но странно, что вы перекрываете данные.Когда вы выводите ячейку из очереди повторного использования, как вы помещаете в нее данные?Вы рисуете данные прямо в ячейке?Добавляете ли вы subViews с данными (вызывая несколько наборов перекрывающихся данных)?Как правило, ячейка содержит подпредставления, такие как текстовые метки, и для них установлены данные, поэтому сценарий перекрытия данных отсутствует - у подпредставлений ячейки просто обновляются данные ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...