Подтвердить что ты не робот

UITableView Delete, Insert & Move ordering в пакетных обновлениях

UITableView обновления между вызовами beginUpdates и endUpdates объединяются вместе и все выполняются одновременно. Документация Apple относится к порядку, в котором выполняются операции insert и delete:

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

Также стоит отметить, что:

Звонки на beginUpdates и endUpdates могут быть вложенными; все индексы обрабатываются , как если бы был только внешний блок обновления.

[Акцент мой]

Итак: подумайте об удалении как происходящем в первом проходе, а затем о любых вставках, следующих за ним, используя новые пути указателей, которые появляются после удаления.

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

4b9b3361

Ответ 1

При перемещении строки таблицы вы указываете два индекса:

  • indexPath в оригинальной таблице, откуда взять эту строку
  • newIndexPath в таблице , где появится эта строка

    func moveRow (в indexPath: IndexPath, to newIndexPath: IndexPath)

Возможные конфликтующие операции в одной партии, вызывающие сбой приложения:

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

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

По умолчанию перемещенная строка не будет перезагружена из источника данных.