Переупорядочивать элементы управления в UITableView, не находясь в режиме редактирования? - PullRequest
11 голосов
/ 23 мая 2011

У меня есть UITableView, и я хочу иметь возможность изменить порядок строк, когда я не в режиме редактирования, то есть я не хочу видеть значки удаления, пока не нажму Edit.Я хочу иметь возможность видеть и использовать элементы управления переупорядочением все время.Это возможно?

Нужно ли постоянно держать UITableView в режиме редактирования и вручную включать / отключать значок удаления?Как отключить свайп для удаления в таком случае?

Ответы [ 4 ]

20 голосов
/ 17 октября 2015

Я нашел решение. 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.

8 голосов
/ 17 августа 2015

Изменение порядка без удаления и без отступов.

- (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 здесь

8 голосов
/ 25 мая 2011

Насколько я знаю, вы не можете сделать это, используя только флаг редактирования. Однако добиться подобного эффекта несложно.

Иметь свой логический т. Е. deleting. Установите ячейку просмотра таблицы в cell.showsReorderControl = YES. Затем реализуйте все методы, необходимые для перемещения клеток. Часть кода, которую я думаю, вы ищете. – tableView:editingStyleForRowAtIndexPath: если deleting == YES вернуть UITableViewCellEditingStyleDelete в противном случае вернуть UITableViewCellEditingStyleNone. Наконец, всегда устанавливайте tableView.editing = YES. Если до и после изменения deleting bool вы запускаете [tableView beginUpdates] и [tableView endUpdates], все должно работать нормально. Дайте мне знать, если это не имеет смысла, и я попробую еще раз.

1 голос
/ 24 апреля 2018

Наконец может отображаться Переупорядочить элемент управления с Проведите до удаления в Режим без редактирования для строки, управляемой Core Data NSFetchedResultsController в Swift 4.1 на Xcode 9.3 как это:

class MyTableViewCell: UITableViewCell {

    override func setEditing(_ editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)

        setupAccessoryView()
    }

    func setupAccessoryView() {
        if accessoryView == nil {
            if let reorderCtrl = subviews.first(where: { (subView) -> Bool in
                subView.description.contains("Reorder")
            }) {
                accessoryView = reorderCtrl
            }
        }
    }
}

class MyTableViewController: UITableViewController, NSFetchedResultsControllerDelegate {

    var frc: NSFetchedResultsController<MyRow>!

    override func viewDidLoad() {
        super.viewDidLoad()

        do {
            // Setup the NSFetchedResultsController here
            try frc.performFetch()

            setEditing(true, animated: false) // Enable for cell reorder control creation on first load
        } catch {
            print(error)
        }
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        setEditing(false, animated: false)
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)

        setEditing(true, animated: false) // Enable for cell reorder control creation when managed object is updated or inserted on other view
    }

    // MARK: - Table view data source

    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        // your data source update here for swipe to delete
    }

    override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
        // your data source update here for sort property value change
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...