Настройка модели для данных UITableView, которые будут фильтроваться с использованием UISegmentedControl - PullRequest
0 голосов
/ 14 мая 2009

Я делаю UITableView с элементом управления UISegmented ala вкладка Недавние вызовы в приложении Телефон.

Первый сегмент будет все элементы, следующие 2 будут подмножества полного списка элементов.

Я создал 3 массива, которые содержат 3 разных списка данных.

Моим первым решением был оптовый обмен данными и перезагрузка:

[self setData:newData];
[self.tableView reloadData];

Это прекрасно работает, за исключением анимации, нет никаких признаков того, что данные действительно изменились. Я мог бы добавить какое-то индикаторное сообщение, но я бы предпочел использовать метод, используемый приложением для телефона, эффект «аккордеона», заключающийся в разрушении удаленных ячеек и расширении добавленных ячеек.

Для этого нельзя просто поменять данные (или нет?). Это не вызывает анимацию. Единственное, что я вижу, это сделать это вручную удалить и добавить ячейки из вспомогательной модели. Итак, каков эффективный алгоритм для достижения этой цели? Мое первое предположение:

У меня есть многомерный массив для представления разделов ячеек.

  1. создать массив для хранения индекса пути добавляемых ячеек
  2. перебирать каждый раздел НОВЫЕ данные
  3. проверить, имеет ли секция НОВЫХ данных тот же счет, что и у СТАРЫХ данных
  4. , если нет, перебирать каждый элемент в НОВЫЕ данные
  5. Если элемент также находится в старых данных, ничего не делать
  6. Если элемент отсутствует в старых данных, добавить индексный путь элемента в массив ячеек, чтобы быть добавлен
  7. Повторите для каждого элемента в разделе
  8. повторить для каждого раздела в НОВЫХ данных
  9. создать массив для хранения индекса пути к удаляемым ячейкам
  10. перебирать каждый раздел СТАРЫЕ данные
  11. проверить, если раздел НОВЫЙ данные имеют то же количество, что и СТАРЫЙ данные
  12. , если нет, перебирать каждый элемент в СТАРЫЕ данные
  13. Если товар тоже в НОВОМ данные, ничего не делать
  14. Если товар отсутствует в НОВЫХ данных, добавить индексный путь элемента в массив ячеек, чтобы быть удален
  15. Повторите для каждого элемента в разделе
  16. повторить для каждого раздела в старых данных

затем вызовите соответствующие методы UITableView:

- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

Похоже, этот алгоритм имеет много возможностей для улучшения. Кто-нибудь еще решал эту проблему? Как ты это реализовал?

Спасибо за любой ввод

Ответы [ 2 ]

0 голосов
/ 25 июня 2009
0 голосов
/ 14 мая 2009

Это выглядит намного сложнее, чем нужно. UITableViews работают по принципу «извлечения», то есть вместо того, чтобы помещать данные в таблицу, он вызывает делегата источника данных и вытягивает в него данные.

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

Теперь, что касается анимации изменения, есть несколько способов, с помощью которых вы можете получить тот же эффект. Если вы действительно хотите использовать эффект аккордеона, вам придется управлять множеством состояний для отслеживания того, находитесь ли вы в режиме отображения или переключения таблиц, и т. Д. Гораздо проще было бы иметь представление с наложением, которое можно анимировать в и визуально указать изменение. Затем в обработчике завершения представления анимации вы должны вызвать reloadData.

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