在UITableView中禁用滑动删除手势

20

是否可以禁用tableView中单元格的“划动删除”手势?如果可以,如何操作?单元格在编辑模式下仍应该可以被编辑,但是划动删除手势应该被禁用。


2
这是和这个问题一样的问题吗? - Sergey Kalinichenko
4个回答

43

以下是需要做的:

- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    // Detemine if it's in editing mode
    if (self.tableView.editing) {
        return UITableViewCellEditingStyleDelete;
    }
    return UITableViewCellEditingStyleNone;
}

你仍需要使用tableView:commitEditingStyle:forRowAtIndexPath:方法以便实现删除动画。

这是比iBrad Apps的解决方案更为简洁的解决方案,因为你可以使用默认的self.editButtonItem而不是自定义按钮。

链接:UITableView禁用滑动删除,但仍然在编辑模式下拥有删除功能?


@dasblinkenlight已经提供了这个链接。没有必要从另一个线程重新发布代码。现在由于我们给了他两种方法,所以取决于OP :) - SimplyKiwi
是的,我实现了这个功能并且它起作用了。我使用了 @dasblinkenlight 的链接。谢谢! - ArtSabintsev
我不明白。哪个单元格索引不想要滑动删除手势?问题指出“一个单元格/行需要禁用它”。 - Teodor Ciuraru
@TeoC。我没有引用索引路径,因为根据问题描述,表中的所有行都被禁止进行滑动删除操作。如果您想要禁用某些行的所有编辑功能(包括滑动删除),可以尝试iBrad Apps的解决方案,返回索引路径的条件而不是NO - aopsfan

14

是的。以下代码将禁用它。

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    return NO;
}

回复您的评论:

编辑2:如果您想要默认按钮,可以前往@dasblinkenlight发布的链接,但是我的下面的代码将与自定义按钮更好地配合使用。

因此,基本上只需创建一个您想要显示编辑按钮的按钮,然后调用此方法即可。

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated:animated];
    [self.tableview setEditing:editing animated:animated];
}

1
单元格在编辑模式下仍应该是可编辑的,但是滑动删除手势应该被禁用。这就是我需要的。 - ArtSabintsev
好的,你应该重新表达一下你的帖子。@dasblinkenlight 给你的链接可以帮你做到这一点。 - SimplyKiwi
谢谢,已编辑帖子。稍后会查看@dasblinkenlight的帖子。 - ArtSabintsev
嗯...制作一个在所有方面都像editButtonItem的按钮,但有一种方式不同似乎是个坏主意,特别是考虑到它可能会很繁琐...既然有一种支持的方法可以做到你需要的,为什么要这样做呢? - aopsfan
我更新了我的帖子,如果你想使用自定义按钮(也许OP想要自定义按钮?),这是更多的内容。如果他想使用传统的方法,我向OP提供了方向。 - SimplyKiwi
@iBradApps 感谢您提供的解决方案。我没有使用自定义按钮,但我理解为什么您可能认为我在使用它。由于某些原因,我需要禁用手势,但仍然可以通过备选的两步流程(例如,在左侧显示红色附件图标,单击后弹出“删除”按钮)来实现单元格删除。再次感谢! - ArtSabintsev

1
这是一个 Swift 版本:

override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {
    if tableView.editing {
        return UITableViewCellEditingStyle.Delete
    }
    return UITableViewCellEditingStyle.None
}

1

如果您不想允许某些单元格被滑动和删除,这里有一个解决方案:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == yourCellIndex) {
        return NO;
    }
    return YES;
}

同时不要忘记实现这个功能,否则它将无法工作:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // do something when deleted
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接