Я хочу что-то похожее на приложение Alarm, где вы не можете удалить строку, но вы все равно можете удалить строку в режиме редактирования.
Когда закомментировал tableView: commitEditingStyle: forRowAtIndexPath :, я отключил смахивание для удаления и все еще имел кнопку Удалить в режиме редактирования, но что происходит, когда я нажимаю кнопку Удалить. Что называется?
ios
cocoa-touch
uitableview
uikit
Вилли
источник
источник
Чтобы прояснить ситуацию, смахивание для удаления не будет включено, если
tableView:commitEditingStyle:forRowAtIndexPath:
оно не будет реализовано.Пока я находился в разработке, я не реализовал его, поэтому удаление смахивания не было включено. Конечно, в готовом приложении это всегда будет реализовано, потому что иначе не было бы редактирования.
источник
Быстрая версия:
override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle { if(do something){ return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert } return UITableViewCellEditingStyle.None }
источник
Вам необходимо реализовать функцию CanEditRowAt.
Вы можете вернуть .delete в функции EditingStyleForRowAt, чтобы можно было удалить в режиме редактирования.
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { if tableView.isEditing { return true } return false } func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle { return .delete }
источник
Обычно вы включаете или отключаете редактирование с помощью методов
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
Если редактирование включено, отображается красный значок удаления и пользователю запрашивается подтверждение удаления. Если пользователь подтверждает, метод делегата
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
получает уведомление о запросе на удаление. Если вы реализуете этот метод, то смахивание для удаления автоматически становится активным. Если вы не реализуете этот метод, смахивание для удаления неактивно, однако вы не сможете удалить строку. Поэтому, насколько мне известно, вы не сможете добиться того, о чем просили, если не используете некоторые недокументированные частные API. Наверное, так реализовано приложение Apple.
источник
На C #:
У меня была такая же проблема, когда нужно было включать / отключать строки с опцией Удалить при смахивании. Несколько строк нужно было провести влево и удалить, оставив их другим цветом. Я добился этой логики.
[Export("tableView:canEditRowAtIndexPath:")] public bool CanEditRow(UITableView tableView, NSIndexPath indexPath) { if (deletedIndexes.Contains(indexPath.Row)){ return false; } else{ return true; } }
Обратите внимание, что deletedIndexes - это список индексов, которые удаляются из таблицы без дубликатов. Этот код проверяет, удалена ли строка, затем отключает смахивание или наоборот.
Эквивалентная функция делегата - Swift
canEditRowAtIndexPath
.источник
Я тоже столкнулся с этой проблемой и исправил ее с помощью приведенных ниже кодов. надеюсь, это поможет вам.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { BOOL deleteBySwipe = NO; for (UIGestureRecognizer* g in tableView.gestureRecognizers) { if (g.state == UIGestureRecognizerStateEnded) { deleteBySwipe = YES; break; } } if (deleteBySwipe) { //this gesture may cause delete unintendedly return; } //do delete }
}
источник