Как включить салфетки для удаления ячейки в TableView?
у меня есть UIViewController
который реализует делегат TableViews и источник данных протоколов.
Теперь я хочу добавить жест "swipe to delete" в ячейки.
как я должен пойти об этом.
Я дал пустую реализации commitEditingStyle
метод, а также установите для свойства редактирования значение YES.
по-прежнему функция салфетки не приходит .
Теперь мне нужно отдельно добавить UISwipeGesture
для каждой ячейки ?
или я что-то пропустил ?
13 ответов:
вы не должны установить
editing:YES
Если вам нужно показать кнопку удаления на салфетки ячейки. Вы должны реализоватьtableView:canEditRowAtIndexPath:
и верните да оттуда для строк, которые вам нужно отредактировать / удалить. Это не обязательно, когда источник данных вашего tableView является подклассом UITableViewContoller - этот метод, если он не переопределен, возвращает YES по умолчанию. Во всех остальных случаях вы должны его реализовать.EDIT: вместе мы нашли проблему -
tableView:editingStyleForRowAtIndexPath:
вернулсяUITableViewCellEditingStyleNone
если таблица не была в режим редактирования.
как Дэн прокомментировал выше, вам нужно реализовать следующие методы делегата представления таблицы:
tableView:canEditRowAtIndexPath:
tableView:commitEditingStyle:forRowAtIndexPath:
Примечание: я пробовал это в iOS 6 и iOS 7.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { // Return YES - we will be able to delete all rows return YES; } - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { // Perform the real delete action here. Note: you may need to check editing style // if you do not perform delete only. NSLog(@"Deleted row."); }
// Override to support conditional editing of the table view. - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { // Return NO if you do not want the specified item to be editable. return YES; } // Override to support editing the table view. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { // Delete the row from the data source [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; } else if (editingStyle == UITableViewCellEditingStyleInsert) { // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view } }
пожалуйста, попробуйте этот код в Swift,
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { // let the controller to know that able to edit tableView's row return true } override func tableView(tableView: UITableView, commitEditingStyle editingStyle UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { // if you want to apply with iOS 8 or earlier version you must add this function too. (just left in blank code) } override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? { // add the action button you want to show when swiping on tableView's cell , in this case add the delete button. let deleteAction = UITableViewRowAction(style: .Default, title: "Delete", handler: { (action , indexPath) -> Void in // Your delete code here..... ......... ......... }) // You can set its properties like normal button deleteAction.backgroundColor = UIColor.redColor() return [deleteAction] }
попробуйте добавить в класс следующее:
// Override to support conditional editing of the table view. - (BOOL) tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { return(YES); }
вывод Dunenkoff Кыр чат
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { }
не должно быть определено, если вам нужно удалить кнопку, чтобы появиться на салфетки.
это версия swift
// Override to support conditional editing of the table view. override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { // Return NO if you do not want the specified item to be editable. return true } // Override to support editing the table view. override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { if editingStyle == .Delete { // Delete the row from the data source tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) } else if editingStyle == .Insert { // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view } }
Это было проблемой и для меня тоже...Я мог только получить swiping для удаления, чтобы работать один раз в 10 или около того попыток. Оказывается,
gesture
на телевизоре был заблокирован другим жестом в контроллере родительского вида. Телевизор был вложен вMMDrawerController
(размах способный макет ящика).просто настройка распознавателя жестов в контроллере ящика, чтобы не реагировать на близкие жесты в боковых ящиках, позволила swipe Удалить для работы в моем телевизоре.
вы также можете попробовать что-то подобное с
gesture delegate
:-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; }
по моему опыту, кажется, что вы должны иметь
editing
onUITableView
значениеNO
для считывания работы.
self.tableView.editing = NO;
если вы используете
NSFetchedResultsControllerDelegate
чтобы заполнить представление таблицы, это сработало для меня:
- убедится
tableView:canEditRowAtIndexPath
возвращает true всегдав своем
tableView:commitEditingStyle:forRowAtIndexPath
реализации, не удаляйте строку непосредственно из таблицы. Вместо этого удалите его с помощью контекста управляемого объекта, например:if editingStyle == UITableViewCellEditingStyle.Delete { let word = self.fetchedResultsController.objectAtIndexPath(indexPath) as! Word self.managedObjectContext.deleteObject(word) self.saveManagedObjectContext() } func saveManagedObjectContext() { do { try self.managedObjectContext.save() } catch { let saveError = error as NSError print("\(saveError), \(saveError.userInfo)") } }
после iOS 8.0 вы можете настроить действие в
- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
NSMutableArray *post= [NSMutableArray alloc]initWithObject:@"1",@"2",@"3",nil]; - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { NSUInteger row = [indexPath row]; NSUInteger count = [posts count]; if (row < count) { return UITableViewCellEditingStyleDelete; } else { return UITableViewCellEditingStyleNone; } } - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { NSUInteger row = [indexPath row]; NSUInteger count = [posts count]; if (row < count) { [posts removeObjectAtIndex:row]; } }