Я делаю UITableView с элементом управления UISegmented ala вкладка Недавние вызовы в приложении Телефон.
Первый сегмент будет все элементы, следующие 2 будут подмножества полного списка элементов.
Я создал 3 массива, которые содержат 3 разных списка данных.
Моим первым решением был оптовый обмен данными и перезагрузка:
[self setData:newData];
[self.tableView reloadData];
Это прекрасно работает, за исключением анимации, нет никаких признаков того, что данные действительно изменились. Я мог бы добавить какое-то индикаторное сообщение, но я бы предпочел использовать метод, используемый приложением для телефона, эффект «аккордеона», заключающийся в разрушении удаленных ячеек и расширении добавленных ячеек.
Для этого нельзя просто поменять данные (или нет?). Это не вызывает анимацию.
Единственное, что я вижу, это сделать это вручную удалить и добавить ячейки из вспомогательной модели. Итак, каков эффективный алгоритм для достижения этой цели?
Мое первое предположение:
У меня есть многомерный массив для представления разделов ячеек.
- создать массив для хранения индекса
пути добавляемых ячеек
- перебирать каждый раздел
НОВЫЕ данные
- проверить, имеет ли секция НОВЫХ данных тот же счет, что и у СТАРЫХ данных
- , если нет, перебирать каждый элемент в
НОВЫЕ данные
- Если элемент также находится в старых данных,
ничего не делать
- Если элемент отсутствует в старых данных,
добавить индексный путь элемента в массив ячеек, чтобы быть
добавлен
- Повторите для каждого элемента в разделе
- повторить для каждого раздела в НОВЫХ данных
- создать массив для хранения индекса
пути к удаляемым ячейкам
- перебирать каждый раздел
СТАРЫЕ данные
- проверить, если раздел НОВЫЙ
данные имеют то же количество, что и СТАРЫЙ
данные
- , если нет, перебирать каждый элемент в
СТАРЫЕ данные
- Если товар тоже в НОВОМ
данные, ничего не делать
- Если товар отсутствует в НОВЫХ данных,
добавить индексный путь элемента в массив ячеек, чтобы быть
удален
- Повторите для каждого элемента в разделе
- повторить для каждого раздела в старых данных
затем вызовите соответствующие методы UITableView:
- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
Похоже, этот алгоритм имеет много возможностей для улучшения. Кто-нибудь еще решал эту проблему? Как ты это реализовал?
Спасибо за любой ввод