Как избежать салфетки для удаления вызова setEditing в UITableViewCell
Я знаю, что когда я реализую tableView:willBeginEditingRowAtIndexPath:
и tableView:didEndEditingRowAtIndexPath:
, прокрутка к удалению не вызывает setEditing:animated:
в моей UITableViewController
(являющейся делегатом UITableView
).
У меня есть обычная реализация UITableViewCell
, которая немного изменяет UI при переходе в режим редактирования. Я хотел быть умным и реализовал эти изменения в setEditing:animated:
в самой реализации ячейки представления таблицы (что, очевидно, имеет смысл).
Однако при прокрутке для удаления я все равно получаю вызов setEditing:animated:
в моей реализации представления таблицы таблиц. И у меня нет параметров, которые говорят мне, что я промахиваю. В стеке вызовов также не отображается ни один из моих собственных методов, который бы дал мне шанс что-то сделать. Он показывает, что setEditing:animated
вызывается в UITableView
. Единственное, что очевидно, это то, что он не вызывается у делегата (мой контроллер в этом случае).
Конечно, я могу установить флаг в ячейке в tableView:willBeginEditingRowAtIndexPath:
, который сообщает ему, что следующий вызов setEditing
будет для прокрутки, но это не похоже на хороший стиль.
Изменить: он даже не работает, потому что не гарантируется, что вызывается tableView:didEndEditingRowAtIndexPath:
, поэтому я не могу установить флаг.
Любые идеи, как решить эту проблему элегантно?
Ответы
Ответ 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: