Проведите пальцем, чтобы удалить против кнопки редактирования, нажатой на iPhone - PullRequest
8 голосов
/ 05 сентября 2010

Я настроил свой viewController на использование кнопки редактирования так, как Apple рекомендует:

self.navigationItem.rightBarButtonItem = self.editButtonItem;

Когда пользователь нажимает кнопку редактирования, он вызывает метод setEditing:animated:.В этом методе я добавляю или удаляю «новую строку» в зависимости от значения editing (т.е. строки, которую пользователь может нажать, чтобы добавить новый элемент).

Когда пользователь проводит по ячейке (покане в режиме редактирования), он также вызывает setEditing:animated:, что заставляет мой код неправильно добавлять эту «новую строку».Эта новая строка должна отображаться только тогда, когда весь viewController находится в режиме редактирования (т. Е. Когда нажата кнопка редактирования).

Как решить эту проблему?

Ответы [ 5 ]

11 голосов
/ 07 сентября 2010

Если вы реализуете tableView:willBeginEditingRowAtIndexPath: и tableView:didEndEditingRowAtIndexPath:, поведение вызовов методов изменится ...

Это больше не будет вызывать setEditing:animated:, вы должны обрабатывать всю логику изменения редактирования внутри вышедва метода.Как побочный эффект этого, self.editing больше не будет YES, когда вызывается жест смахивания.Это потому, что setEditing:animated: отвечает за настройку self.editing = YES.

3 голосов
/ 05 сентября 2010

Используйте метод UITableViewDelegate tableView:willBeginEditingRowAtIndexPath:. Из документации:

Этот метод вызывается, когда пользователь проводит горизонтально по строке; как Как следствие, табличное представление устанавливает свойство редактирования на YES (тем самым вводя редактирование mode) и отображает кнопку «Удалить» в строке, обозначенной indexPath. В этом "проведите Режим «Удалить»: табличное представление не отображает вставки, удаления и переупорядочения управления. Этот метод дает делегату возможность настроить пользователя приложения интерфейс к режиму редактирования. Когда таблица выходит из режима редактирования (например, пользователь нажимает кнопка Удалить), табличное представление вызывает tableView:didEndEditingRowAtIndexPath:.

В tableView:willBeginEditingRowAtIndexPath: установите флажок, чтобы режим редактирования был активирован с помощью удара для удаления. Затем, в setEditing:animated:, установите флажок, чтобы увидеть, был ли режим редактирования запущен нормально, или с помощью пролистывания удалите и выполните некоторые действия, основанные на этой проверке. Наконец, сбросьте флаг в tableView:didEndEditingRowAtIndexPath:, чтобы действие по умолчанию было выполнено при нажатии кнопки редактирования.

0 голосов
/ 09 сентября 2018

Таблица входит в режим редактирования, когда пользователь нажимает кнопку редактирования, а также когда проводишь по ячейке. Чтобы различать эти два случая, вы можете переопределить willBeginEditingRowAtIndexPath (не забудьте вызвать super или режим редактирования не будет введен) и сохранить путь индекса в свойстве. Переопределите setEditing, и вы можете проверить свойство и добавить строку вставки, только если она равна нулю (т. Е. Когда пользователь не проводит пальцем).

@interface MasterViewController ()

@property (nonatomic, strong, nullable) NSIndexPath *tableViewEditingRowIndexPath;

@end

@implementation MasterViewController

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath{
    self.tableViewEditingRowIndexPath = indexPath;
    [super tableView:tableView willBeginEditingRowAtIndexPath:indexPath]; // calls setEditing:YES
}

-(void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath{
    [super tableView:tableView didEndEditingRowAtIndexPath:indexPath]; // calls setEditing:NO
    self.tableViewEditingRowIndexPath = nil;
}

- (void)setEditing:(BOOL)editing animated:(BOOL)animated{
    [super setEditing:editing animated:animated];
    if(self.tableViewEditingRowIndexPath){
         // we are swiping
         return;
    }
    if(editing){
        // insert row for adding
    }
    else{
        // remove row for adding
    }
}
0 голосов
/ 05 сентября 2010

Смысл, вы должны переопределить setEditing: animated: метод.или даже вы можете установить флаг в этом методе, как предложил Eiko.

или другой способ -

u реализовать пользовательскую панель навигации.в этом случае вам нужно изображение панели навигации и 2 кнопки над ней.добавить цель к этой кнопке и реализовать функциональность по мере необходимости

0 голосов
/ 05 сентября 2010

Я понятия не имею, о чем ваша «новая строка», но вы можете прикрепить свою кнопку редактирования к вспомогательному методу, который устанавливает флаг перед вызовом setEditing, и там вы можете проверить, установлен ли упомянутый флаг, и вести себя соответственно.Затем снимите флажок в конце метода.

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