Головная боль от анимации UITableView
-
11-09-2019 - |
Вопрос
NSIndexPath* updatedPath = [NSIndexPath indexPathForRow: 0 inSection: 0];
NSIndexPath* updatedPath2 = [NSIndexPath indexPathForRow: 1 inSection: 0];
NSArray* updatedPaths = [NSArray arrayWithObjects:updatedPath, updatedPath2, nil];
[self.mySexyTableView reloadRowsAtIndexPaths:updatedPaths withRowAnimation:UITableViewRowAnimationTop];
Приведенный выше код работает, и он анимируется.Проблема в том, что у меня много данных, и я не хочу жестко кодировать индексы строк.Поскольку у меня есть только один раздел в моей таблице, раздел может быть равен 0.Как я могу динамически генерировать NSArray объектов NSIndexPath?
Или есть более простой способ анимировать табличное представление?Все строки в моем табличном представлении изменяются, когда пользователь нажимает на вкладку в верхней части табличного представления.
Решение
Чтобы сгенерировать массив путей к индексам, вы могли бы просто выполнить цикл:
NSMutableArray *updatedPaths = [NSMutableArray array];
for (NSNumber *row in someArray) {
NSIndexPath *updatedPath = [NSIndexPath indexPathForRow:[row intValue] inSection:0];
[updatedPaths addObject:updatedPath];
}
[self.mySexyTableView reloadRowsAtIndexPaths:updatedPaths withRowAnimation:UITableViewRowAnimationTop];
Если вы перезагружаете все данные в свой TableView, почему бы просто не вызвать метод reloadData?
Другие советы
Если вы хотите обновить весь раздел целиком:
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationTop];
Если у вас есть более одного indexPathForRow с равным индексом строки, вы получите это исключение.
Для примера
[segmentTable reloadRowsAtIndexPaths: [[NSArray alloc] initWithObjects:
[NSIndexPath indexPathForRow: 1 inSection: 1],
[NSIndexPath indexPathForRow: 1 inSection: 1], nil] withRowAnimation:UITableViewRowAnimationNone];
Наконец-то у меня это заработало.Вот этот код:
NSMutableArray *indexPaths = [[[NSMutableArray alloc] init] autorelease];
for (int i = 0; i < [mySexyList count]; i++) {
NSIndexPath *updatedPath = [NSIndexPath indexPathForRow:i inSection:0];
[indexPaths addObject:updatedPath];
}
[self.myFunkyTableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop];
Проблема заключалась в том, что я возвращал жестко закодированное значение из numberOfRowsInSection:метод, который не совпадал с размером mySexyList.Это приводило к сбою приложения.
Предполагать self.arTableData
представляет собой изменяемый массив таблиц & tableView
является примером UITableView
.Предположим , что имеется 10 строк ( что означает 10 объектов в массиве ) в tableView
.Я действительно реализую следующий код для удаления анимированных строк.
int i; // to remove from 3 to 6
for(i=2;i<6;i++)
{
[self.arTableData removeObjectAtIndex:i];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationRight];
}
Этот трюк работает у меня без каких-либо проблем.Надеюсь, у вас это сработает так же.Желаю удачи.
Просто чтобы добавить свое решение в общую смесь, поскольку оно было простым, как только я его нашел.Что происходило, так это то, что у меня есть таблица, которая "сгруппирована" по моему собственному коду с использованием той же техники, что и в: cocoanetics.com
Когда пользователь делает что-то, требующее обновления ячейки, а таблица в то время не была сгруппирована, мой код пытался использовать
[[self tableView] reloadRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationAutomatic];
указание путей как к ячейке, так и к несуществующему заголовку.Это вызвало ту же ошибку, о которой другие сообщали выше.Все, что мне нужно было сделать, это убедиться, что "пути" предоставлены для reloadRowsAtIndexPaths:withRowAnimation:на самом деле существовал.Когда это было сделано, все было в порядке.