Если вы выполняете перетаскивание одного элемента локально , вы можете использовать tableView(_:moveRowAt:to:)
. Для этого вам необходимо реализовать UITableViewDragDelegate .
Настройка
Начните с настройки ваших делегатов. Для iPhone требуется установка dragInteractionEnabled
.
func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
tableView.dragDelegate = self
tableView.dragInteractionEnabled = true
}
UITableViewDragDelegate
Обратите внимание, что массив возвращает один элемент. Если вы вернете более одного элемента, вместо tableView(_:moveRowAt:to:)
будут использоваться методы UITableViewDropDelegate
. Вы должны установить локальный объект.
func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
let dragItem = UIDragItem(itemProvider: NSItemProvider())
dragItem.localObject = data[indexPath.row]
return [ dragItem ]
}
Перемещение
Здесь происходит перемещение, которое фактически является частью UITableViewDelegate
.
func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
// Update the model
let mover = data.remove(at: sourceIndexPath.row)
data.insert(mover, at: destinationIndexPath.row)
}
Вы можете также используйте tableView(_:canMoveRow:at:
) и tableView(_:targetIndexPathForMoveFromRowAt: toProposedIndexPath:)
, если необходимо.
Подробнее вы можете прочитать здесь ...