UITableView Delete, Insert & Move ordering в пакетных обновлениях
UITableView
обновления между вызовами beginUpdates
и endUpdates
объединяются вместе и все выполняются одновременно. Документация Apple относится к порядку, в котором выполняются операции insert
и delete
:
Операции удаления и перезагрузки в блоке анимации определяют, какие строки и разделы в исходной таблице должны быть удалены или перезагружены; вставки указывают, какие строки и разделы должны быть добавлены в результирующую таблицу. Пути индекса, используемые для идентификации разделов и строк, следуют этой модели. С другой стороны, вставка или удаление элемента в изменяемом массиве может повлиять на индекс массива, используемый для последовательной операции вставки или удаления; например, если вы вставляете элемент по определенному индексу, индексы всех последующих элементов массива увеличиваются.
Также стоит отметить, что:
Звонки на beginUpdates и endUpdates могут быть вложенными; все индексы обрабатываются , как если бы был только внешний блок обновления.
[Акцент мой]
Итак: подумайте об удалении как происходящем в первом проходе, а затем о любых вставках, следующих за ним, используя новые пути указателей, которые появляются после удаления.
Это полезно. Однако, я не нашел никакой документации о том, где происходят перемещения строк (и секций), какую индексацию они должны использовать и влияет ли это на другие шаги. Кто-нибудь знает?
Ответы
Ответ 1
При перемещении строки таблицы вы указываете два индекса:
-
indexPath
в оригинальной таблице, откуда взять эту строку
-
newIndexPath
в таблице , где появится эта строка
func moveRow (в indexPath: IndexPath, to newIndexPath: IndexPath)
Возможные конфликтующие операции в одной партии, вызывающие сбой приложения:
- попытка перемещения строки, которую вы также удаляете
- пытается переместить одну строку в несколько пунктов назначения
- пытается переместить несколько строк в один и тот же пункт назначения
- пытается переместить строку в тот же пункт назначения, где вы вставляете новую строку
Невозможно переместить строку, которую вы вставляете, потому что ее не было в исходной таблице.
По умолчанию перемещенная строка не будет перезагружена из источника данных.