Переупорядочить элементы управления 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