Подтвердить что ты не робот

Как избежать салфетки для удаления вызова setEditing в UITableViewCell

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

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

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

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

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

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

4b9b3361

Ответ 1

Я думаю, что метод экземпляра UITableViewCell 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
    }
}

Это что?

Ответ 2

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

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

@implementation MyTableViewController {
    BOOL _cellSwiped;
}

Переопределите метод setEditing, чтобы искать переменную _cellSwiped и распространяйте ее только в том случае, если мы не проверили. Часть, которую люди, кажется, не хватает, заключается в том, что _cellSwiped должен быть reset обратно в 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

Что я делаю, это примерно так:

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

Тогда в

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

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

Ответ 4

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

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

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

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

Ответ 5

- (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: