如何启用滑动删除TableView中的单元格?

我有一个UIViewController实现TableViews委托和数据源协议。 现在我想添加“滑动删除”手势的单元格。

我应该如何去做。

我已经给了commitEditingStyle方法的一个空白实现,并且将Editing属性设置为YES。

仍然刷卡function不来。

现在我需要分别添加UISwipeGesture到每个单元格吗?

还是我错过了什么?

您不必设置editing:YES如果您需要在单元格滑动时显示“删除”button,则为editing:YES 。 你必须实现tableView:canEditRowAtIndexPath:并从那里返回YES,以便你需要编辑/删除的行。 当你的tableView的dataSource是UITableViewContoller的子类时,这是没有必要的 – 如果这个方法没有被覆盖,默认返回YES。 在所有其他情况下,你必须执行它。

编辑:我们一起发现问题 – tableView:editingStyleForRowAtIndexPath:如果表不处于编辑模式,则返回UITableViewCellEditingStyleNone

正如丹在上面评论过的,你需要实现下面的表格来查看委托方法:

  1. tableView:canEditRowAtIndexPath:
  2. 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 } } 

请迅速尝试此代码,

 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); } 

Kyr Dunenkoff聊天的结论是

 - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { } 

如果你需要删除button出现在刷卡上,不应该被定义。

这是很快的版本

 // 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 } } 

这对我来说也是一个问题,我只能每10次尝试一次就删除一次。 事实certificate,电视上的手势被父视图控制器中的另一个手势阻挡。 电视机嵌套在MMDrawerController (可滑动的抽屉布局)中。

只需将抽屉控制器中的手势识别器configuration为不响应侧翼抽屉中的closures手势,便可以通过滑动删除以在电视机上工作。

你也可以用gesture delegate来做这样的事情:

 -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; } 

根据我的经验,似乎你必须editing UITableView设置为NO滑动工作。

self.tableView.editing = NO;

如果您正在使用NSFetchedResultsControllerDelegate填充表视图,这对我工作:

  • 确保tableView:canEditRowAtIndexPath总是返回true
  • 在你的tableView:commitEditingStyle:forRowAtIndexPath实现中,不要直接从表视图中删除行。 相反,请使用托pipe对象上下文将其删除,例如:

     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]; } } 

您可以通过在XCode 5中创build一个UITableViewController类(临时)来查看所有必需的方法,然后复制您想要使用的方法。 你需要的那些方法将被预先填充你想要的行注释掉。