如何启用滑动删除TableView中的单元格?
我有一个UIViewController
实现TableViews委托和数据源协议。 现在我想添加“滑动删除”手势的单元格。
我应该如何去做。
我已经给了commitEditingStyle
方法的一个空白实现,并且将Editing属性设置为YES。
仍然刷卡function不来。
现在我需要分别添加UISwipeGesture
到每个单元格吗?
还是我错过了什么?
您不必设置editing:YES
如果您需要在单元格滑动时显示“删除”button,则为editing:YES
。 你必须实现tableView:canEditRowAtIndexPath:
并从那里返回YES,以便你需要编辑/删除的行。 当你的tableView的dataSource是UITableViewContoller的子类时,这是没有必要的 – 如果这个方法没有被覆盖,默认返回YES。 在所有其他情况下,你必须执行它。
编辑:我们一起发现问题 – 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 } }
请迅速尝试此代码,
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类(临时)来查看所有必需的方法,然后复制您想要使用的方法。 你需要的那些方法将被预先填充你想要的行注释掉。