Я нашел решение. UITableViewCell
отказывается рисовать элемент управления переупорядочением, если он не находится в режиме редактирования. К счастью, UITableViewCell
и UITableView
редактируют треки отдельно, и, что важно, UITableView
фактически выполняет переупорядочение независимо от собственного режима редактирования. Нам просто нужно обмануть клетки, чтобы нарисовать элементы управления переупорядочением, и мы свободны.
Подкласс UITableViewCell
как это:
class ReorderTableViewCell: UITableViewCell {
override var showsReorderControl: Bool {
get {
return true // short-circuit to on
}
set { }
}
override func setEditing(editing: Bool, animated: Bool) {
if editing == false {
return // ignore any attempts to turn it off
}
super.setEditing(editing, animated: animated)
}
}
Теперь просто установите editing = true
в ячейках, для которых вы хотите включить переупорядочение. Вы можете сделать это условным на -tableView:canMoveRowAtIndexPath:
.
В вашем источнике данных табличного представления:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
// Configure the cell...
:
cell.editing = self.tableView(tableView, canMoveRowAtIndexPath: indexPath) // conditionally enable reordering
return cell
}
Единственным недостатком является то, что это несовместимо с опцией представления таблицы allowsMultipleSelectionDuringEditing
; элемент управления редактирования всегда отображается неправильно. Обходной путь должен включать множественный выбор только во время фактического редактирования представления таблицы.
В вашем контроллере табличного представления:
override func setEditing(editing: Bool, animated: Bool) {
super.setEditing(editing, animated: animated)
self.tableView.allowsMultipleSelectionDuringEditing = editing // enable only during actual editing to avoid cosmetic problem
}
Кроме того, в -viewDidLoad
или вашей раскадровке установите начальное значение allowsMultipleSelectionDuringEditing
в значение false.