Я бился головой об этом, а Google ничего не показывал. В конце концов я решил это и подумал, что напишу это здесь для следующего человека.
У вас есть UITableView
несколько разделов. Каждый раздел однороден, но в целом таблица неоднородна. Таким образом, вы можете разрешить переупорядочивание строк внутри раздела, но не между разделами. Может быть, вы даже хотите, чтобы один раздел вообще можно было переупорядочить (это был мой случай). Если вы смотрите, как и я, UITableViewDataSourceDelegate
вы не найдете уведомления о том, когда он собирается позволить вам перемещать строку между разделами. Вы получаете один, когда он начинает перемещать строку (что нормально), и один, когда он уже переместил ее, и у вас есть возможность синхронизироваться со своими внутренними данными. Не полезно.
Так как же предотвратить повторный заказ между разделами?
Я опубликую то, что я сделал, как отдельный ответ, оставив его открытым, чтобы кто-то другой опубликовал еще лучший ответ!
источник
Ответы:
Эта реализация предотвратит переупорядочение за пределами исходного раздела, как ответ Фила, но также привяжет запись к первой или последней строке раздела, в зависимости от того, где произошло перетаскивание, а не где оно началось.
источник
UIKit.UITableViewController.CustomizeMoveTarget
, если кому интересно.На самом деле, достаточно просто.
UITableViewDelegate имеет метод:
Это вызывается, когда пользователь наводит курсор на потенциальную точку сброса. У вас есть возможность сказать: «Нет! Не роняйте его сюда! Вместо этого бросайте сюда». Вы можете вернуть другой путь индекса к предложенному.
Все, что я сделал, это проверил, совпадают ли индексы разделов. Если они это сделают, то отлично, верните предложенный путь. если нет, верните исходный путь. Это также прекрасно предотвращает смещение строк в других разделах даже при перетаскивании - и перетаскиваемая строка вернется в исходное положение, если вы попытаетесь переместить ее в другой раздел.
источник
Быстрая версия ответа Джейсона для вас, ленивых:
Swift 3, 4 и 5
Swift 1 и 2
источник
Вы можете предотвратить перемещение строк между разделами, используя метод ниже. Только не допускайте никакого движения между секциями. Вы даже можете управлять перемещением определенной строки в разделе. например, последняя строка в разделе.
Вот пример:
источник
Swift 3:
источник
Чем @Jason Harwig, приведенный ниже код работает правильно.
источник
Чтобы не менять положение между разделами Swift3
источник