我有一个UIViewController
实现TableViews委托和数据源协议的。现在,我想向单元格添加“滑动删除”手势。
我应该怎么做。
我给出了commitEditingStyle
方法的空白实现,并且还将Editing属性设置为YES。
仍然没有滑动功能。
现在我需要分别添加UISwipeGesture
到每个单元格吗?
还是我错过了什么?
我有一个UIViewController
实现TableViews委托和数据源协议的。现在,我想向单元格添加“滑动删除”手势。
我应该怎么做。
我给出了commitEditingStyle
方法的空白实现,并且还将Editing属性设置为YES。
仍然没有滑动功能。
现在我需要分别添加UISwipeGesture
到每个单元格吗?
还是我错过了什么?
Answers:
editing:YES
如果需要在单元格滑动时显示“删除”按钮,则无需设置。tableView:canEditRowAtIndexPath:
对于需要编辑/删除的行,您必须实现并从那里返回YES。当tableView的dataSource是UITableViewContoller的子类时,则不需要此方法-如果未重写此方法,则默认情况下返回YES。在所有其他情况下,您都必须实现它。
编辑:我们一起发现了问题-如果表未处于编辑模式,则tableView:editingStyleForRowAtIndexPath:
返回该问题UITableViewCellEditingStyleNone
。
[tableView setEditing:YES];
吗?
tableView:canEditRowAtIndexPath:
可能还不够。您还必须实现tableView:commitEditingStyle:forRowAtIndexPath
。
正如Dan在上面评论的那样,您需要实现以下表视图委托方法:
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.");
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
方法,因为默认情况下编辑应为YES。
// 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 {
}
如果需要在删除时显示删除按钮,则不应定义。
如果您使用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)")
}
}
这是快速版本
// 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次尝试我只能滑动一次才能删除以工作。事实证明,gesture
电视被父视图控制器中的另一个手势阻止了。电视被嵌套在MMDrawerController
(可滑动滑动的抽屉布局)中。
只需在抽屉控制器中配置手势识别器,使其不对侧面抽屉中的关闭手势做出响应,就可以在我的电视上进行滑动删除操作。
您也可以尝试使用gesture delegate
:
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
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中创建UITableViewController类(临时),然后复制要使用的方法,可以看到所有必需的方法。您需要的那些方法将被注释掉,并在您想要的行中预先填充。