Переупорядочить элементы управления UITableView, пока он не находится в режиме редактирования?
У меня есть UITableView, и я хочу, чтобы иметь возможность изменять порядок строк, когда я не в режиме редактирования, то есть я не хочу видеть значки удаления, пока не нажму Edit. Я хочу видеть и использовать элементы управления переупорядочения все время. Возможно ли это?
Должен ли я постоянно держать UITableView в режиме редактирования и включать/отключать значок удаления вручную? Как отключить удаление удаленных файлов в этом случае?
Ответы
Ответ 1
Насколько я знаю, вы не можете сделать это, используя только флаг редактирования. Однако достичь такого эффекта не трудно.
Имейте свое собственное логическое значение, т.е. deleting
. Установите для ячейки tableview значение cell.showsReorderControl = YES
.
Затем выполните все методы, необходимые для перемещения ячеек. Немного кода, который, я думаю, вы ищете.
– tableView:editingStyleForRowAtIndexPath:
if deleting == YES
return UITableViewCellEditingStyleDelete
в противном случае возвращает UITableViewCellEditingStyleNone
.
Наконец, установите tableView.editing = YES
всегда. Если до и после изменения deleting
bool вы запускаете [tableView beginUpdates]
и [tableView endUpdates]
, все должно работать нормально. Дайте мне знать, если это не имеет смысла, и я попробую еще раз.
Ответ 2
Я нашел решение. 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.
Ответ 3
Изменить порядок без удаления и без отступов.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
return YES;
}
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewCellEditingStyleNone;
}
- (BOOL)tableView:(UITableView *)tableview shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath {
return NO;
}
- (BOOL)tableView:(UITableView *)tableview canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
return YES;
}
Ссылка: Решение опубликовано Stefan von Chossy here