Как избежать смахивания для удаления вызова setEditing на UITableViewCell - PullRequest
15 голосов
/ 22 июня 2011

Я знаю, что, когда я реализую tableView:willBeginEditingRowAtIndexPath: и tableView:didEndEditingRowAtIndexPath:, при удалении смахивания не вызывается setEditing:animated: в моем UITableViewController (являющемся делегатом UITableView).

У меня есть пользовательская реализация UITableViewCell, которая немного переставляет интерфейс при переходе в режим редактирования.Я хотел быть умным и реализовал эти изменения в setEditing:animated: в самой реализации ячейки табличного представления (что, очевидно, имеет смысл).

Однако, когда проводишь пальцем по удалению, я все равно получаю вызов setEditing:animated: вмоя реализация представления представления таблицы.И у меня нет параметра, который говорит мне, что я провожу.Стек вызовов также не показывает ни один из моих собственных методов, которые дали бы мне возможность что-то сделать.Это показывает, что setEditing:animated вызывается в UITableView.Очевидно, единственное, что он не вызывается у делегата (в данном случае мой контроллер).

Конечно, я мог бы установить флаг в ячейке в tableView:willBeginEditingRowAtIndexPath:, который говорит, что следующий setEditing вызов будет для прокрутки, но это не похоже на хороший стиль.

Редактировать : он даже не работает, потому что не гарантируется, что вызывается tableView:didEndEditingRowAtIndexPath:поэтому я не могу установить флаг обратно.

Есть идеи, как решить эту проблему элегантно?

Ответы [ 5 ]

23 голосов
/ 06 августа 2011

Я думаю, что * UTableViewCell willTransitionToState: метод экземпляра может быть тем, что вы ищете. Примерно так:

- (void)willTransitionToState:(UITableViewCellStateMask)state
{
    if (state == UITableViewCellStateShowingDeleteConfirmationMask) {
        swipedToDelete = YES; // BOOL ivar
    }
}

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    if (swipedToDelete) {
        // do your stuff, or don't
    }
}

Это так?

5 голосов
/ 29 марта 2013

Я знаю, что это, вероятно, было сделано до смерти, но представленные решения не казались полным простым ответом, и при этом они не давали хороший пример кода, поэтому я решил добавить свой ответ.

Добавьте в свой класс личную переменную экземпляра:

@implementation MyTableViewController {
    BOOL _cellSwiped;
}

Переопределите метод setEditing, чтобы найти переменную _cellSwiped, и распространяйте ее только в том случае, если мы не проводим пальцем. Часть, которую люди, похоже, пропускают, заключается в том, что _cellSwiped необходимо сбросить обратно на NO, иначе вы никогда не сможете использовать кнопку редактирования после прокрутки!

- (void) setEditing:(BOOL)editing animated:(BOOL)animated {
    if (!_cellSwiped) {
        [super setEditing:editing animated:animated];
    } else if (!editing) {
        _cellSwiped = NO;
    }
}

Наконец, добавьте переопределение этого метода для обнаружения удара:

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath {
    _cellSwiped = YES;
}
3 голосов
/ 12 февраля 2015

Это старый вопрос, но мне интересно, почему никто, кажется, не знает о том факте, что свойство showingDeleteConfirmation встроено прямо в UITableViewCell (начиная с iOS 2.0):

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    [super setEditing:editing animated:animated];

    BOOL reallyEditing = editing && !self.showingDeleteConfirmation;
    // [...]
}

Нет необходимости переопределять -willTransitionToState: и вручную отслеживать состояние.

3 голосов
/ 23 июля 2011

Я делаю что-то вроде этого:

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    cellSwiped = YES;
    self.editing = NO;
}

Затем в методе

- (void)setEditing:(BOOL)editing animated:(BOOL)animated 

я просто проверяю, установлен ли cellSwiped ivar, и соответствующим образом изменяю пользовательский интерфейс.

1 голос
/ 09 августа 2011
- (void)tableView:(UITableView *)tableview commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if(editingStyle != UITableViewCellEditingStyleDelete) {
       // add code here

    }
}

При вызове этот метод будет выполнять следующие операции

UITableViewCellEditingStyleNone,
UITableViewCellEditingStyleDelete,
UITableViewCellEditingStyleInsert

Если вам не нужна опция swipe, вы можете установить переменную bool в методе делегата

- (void)willTransitionToState:(UITableViewCellStateMask)state

willTransitionToState будет вызываться раньше

commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:
...