Определите, когда UITableView переупорядочивается - PullRequest
4 голосов
/ 27 апреля 2010

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

Invalid update: invalid number of rows in section [...]

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

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath {

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

Одним из решений является проверка isEditing в полученных ответных колбэках результатов и просто выполнение объемной reloadData вместо динамической вставки / удаления строк, но мне интересно, есть ли способ специально проверить «переупорядочение» режим.

Ответы [ 2 ]

1 голос
/ 11 августа 2011

Вы не правы, tableView: canMoveRowAtIndexPath не решает проблему.

Используйте [cell setEditing: NO] для всех ячеек, которые вы хотите обновить или удалить.

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

Если вам нужно [cell setEditing: YES], вы можете восстановить его сразу после завершения обновления.

0 голосов
/ 27 апреля 2010

Прежде чем таблица перемещается в строку, она отправляет ...

– tableView:canMoveRowAtIndexPath:

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

Возможно, вы захотите немного переосмыслить свой дизайн. Похоже, у вас есть модель данных, которая может быть изменена двумя разными источниками одновременно. Если это так, то вам нужно установить некоторую блокировку параллелизма в пределах самой модели данных, чтобы две модификации не могли фактически произойти одновременно. Одновременные изменения будут вызывать проблемы не только с пользовательским интерфейсом, но и со всем, что использует модель данных.

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