Если вы хотите поддерживать перетаскивание только с целью переупорядочения строк, вам не нужен код, который вы опубликовали.
Реализуйте обычные методы переупорядочения UITableViewDataSource и UITableViewDelegate. ,Установите таблицы dragDelegate
и dropDelegate
. Вам нужно реализовать только один метод, каждый из UITableViewDragDelegate и UITableViewDropDelegate, и их реализации тривиальны.
Для простого односекционного табличного представления все, что вам нужно, это следующее:
override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
return true
}
override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
// Update your data model array to move the item at sourceIndexPath.row to destinationIndexPath.row
}
// MARK: - UITableViewDragDelegate
func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
return []
}
// MARK: - UITableViewDropDelegate
func tableView(_ tableView: UITableView, performDropWith coordinator: UITableViewDropCoordinator) {
// no-op
}
Убедитесь, чтовы устанавливаете свойства dragDelegate
и dropDelegate
представления таблицы на self
в viewDidLoad
или в раскадровке. Вам также необходимо включить свойство dragInteractionEnabled
.
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.dragDelegate = self
self.tableView.dropDelegate = self
self.tableView.dragInteractionEnabled = true
}
Это все, что вам нужно для поддержки переупорядочения строк с помощью перетаскивания. Конечно, для сложных моделей данных и нескольких разделов вам может потребоваться также реализовать метод делегата targetIndexPathForMoveFromRowAt
, а вашей логике в moveRowAt
может потребоваться дополнительная логика.
Что интересно, так это необходимостьустановить dropDelegate
и включить dragInteractionEnabled
необходимо только для айфонов. Версия для iPad (и Mac Catalyst) не нуждается в этих наборах.