Перезагрузка просмотра таблицы каждый раз, когда вы хотите добавить или удалить строку, создает плохой опыт для пользователя вашего приложения. Несмотря на то, что это не эффективный способ выполнения этой задачи, он также имеет некоторые отрицательные побочные эффекты: выбранные строки не остаются выбранными после перезагрузки, а изменение не анимируется.
UITableView
имеет методы, которые были созданы для динамического изменения содержимого табличного представления.К ним относятся:
insertRowsAtIndexPaths:withRowAnimation:
moveRowAtIndexPath:toIndexPath:
deleteRowsAtIndexPaths:withRowAnimation:
Обратите внимание, что эти методы позволяют указать тип анимации, который будет использоваться, когда указанная операция выполняется - вы не можете достичь такого поведения, когда вы используете reloadData
изменить содержание представления таблицы ,
Кроме того, вы можете даже объединить несколько операций просмотра таблицы с использованием дополнительных методов представления таблицы (это не обязательно):
beginUpdates endUpdates
Просто оберните операции, которые нужно выполнить в вызовы beginUpdates
и endUpdates
методы и представление таблицы создадут один анимация для всех операций, которые были запрошены между beginUpdates
и endUpdates
, так что весь переход выглядит более приятным, чем тот, который создается несколькими отдельными анимациями.
[self.tableView beginUpdates]
//calls to insert/move and delete methods
[self.tableView endUpdates]
Это действительно важно, чтобы держать вас в состояние источника данных в соответствии с одним хранящейся UITableView
. По этой причине вы должны убедиться, что, когда представление таблицы начнет выполнять запрошенные операции, его источник данных вернет правильные значения.
[self.tableView beginUpdates]
//calls to insert/move and delete methods
//operations on our data source so that its
//state is consistent with state of the table view
[self.tableView endUpdates]
Когда рабочий стол начинает выполнять операции? Это зависит от того, находятся ли операции в блоке анимации, определяемые методами beginUpdates
и endUpdates
. Если да, представление таблицы начинает выполнять операции после вызова метода endUpdates
. В противном случае представление таблицы выполняет операции сразу после того, как был сделан вызов метода insert/move или delete.
Когда вы используете методы для работы над табличным представлением beginUpdates
и , вы должны знать, что в этом случае вид таблицы, запрошенные партии и выполняют их в определенном порядке, который не является необходимым, как порядок вызовов вы сделали на вашем объекте просмотра таблицы (Apple's documentation on this topic).
Самое главное помнить, что удаление всех операций всегда выполняется перед всеми операциями вставки. Кроме того, операции удаления, по-видимому, выполняются в порядке убывания (операции для индексов 3, 2, 1), когда операция вставки выполняется в порядке возрастания (операции для индексов 1, 2, 3). Помните об этом критический в состоянии хранения вашего источника данных в соответствии с сохраненным табличным представлением.
Проведите некоторое время на анализ порядка операций с источником данных и представлением таблицы в представленном ниже примере.
Заключительный пример:
//initial state of the data source
self.numbers = [@[@(0), @(1), @(2), @(3), @(4), @(5), @(6)] mutableCopy];
//
//...
//
NSArray indexPathsToRemove = @[[NSIndexPath indexPathForRow:3 section:0].
[NSIndexPath indexPathForRow:0 section:0];
NSArray indexPathsToAdd = @[[NSIndexPath indexPathForRow:6 section:0],
[NSIndexPath indexPathForRow:5 section:0]];
[self.tableView beginUpdates];
[self.numbers removeObjectAtIndex:3];
[self.numbers removeObjectAtIndex:0];
[self.numbers insertObject:@(10) atIndex:4];
[self.numbers insertObject:@(11) atIndex:5];
[self.tableView insertRowsAtIndexPaths:indexPathsToAdd withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView deleteRowsAtIndexPaths:indexPathsToRemove withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView endUpdates];
//final state of the data source ('numbers') - 1, 2, 4, 5, 6, 10, 11
В принципе, вы не добавляете их в представление, а скорее в модель. После того, как вы это сделали, метод tableloads reloadData - ваш друг – HeikoG