Мне удалось решить эту проблему, но, к сожалению, это требует дополнительных усилий и не так просто, как установка пары свойств.
По моему
- (UITableViewCellEditingStyle)tableView:(UITableView *)_tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
метод, который я возвращаю UITableViewCellEditingStyleNone
, чтобы появился мой пользовательский editingAccessoryView
. В этом методе я также делаю это:
self.tableView.scrollEnabled = NO;
if(self.editingPath)
{
[[tableView cellForRowAtIndexPath:editingPath] setEditing:NO animated:YES];
}
self.editingPath = indexPath;
for (UITableViewCell *cell in [tableView visibleCells])
{
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
Это отключает прокрутку, а затем сохраняет indexPath
, который мы провели для дальнейшего использования. Если вы проведете пальцем по другой строке во время редактирования строки, она отредактирует первую строку и отредактирует вторую строку, как ведут себя приложения Apple. Я также установил ячейку selectionStyle
на всех видимых ячейках на UITableViewCellSelectionStyleNone
. Это уменьшает синее мерцание, когда пользователь выбирает другую ячейку во время редактирования.
Далее нам нужно отклонить accessoryView
при нажатии другой ячейки. Для этого мы реализуем этот метод:
-(NSIndexPath *)tableView:(UITableView *)_tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(self.editingPath)
{
UITableViewCell *c = [tableView cellForRowAtIndexPath:self.editingPath];
[c setEditing:NO animated:YES];
self.tableView.scrollEnabled = YES;
self.editingPath = nil;
for (UITableViewCell *cell in [tableView visibleCells])
{
cell.selectionStyle = UITableViewCellSelectionStyleBlue;
}
return nil;
}
return indexPath;
}
Что происходит, когда кто-то собирается щелкнуть ячейку, если мы редактируем, то редактируем эту ячейку и ничего не возвращаем.
также для
-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
Я возвращаю YES
, чтобы разрешить редактирование ячеек, которые я хочу, чтобы пользователь мог удалить.