UITableView禁用滑动以删除,但在“编辑”模式下仍具有删除功能吗?


91

我想要类似“警报”应用程序的内容,在该应用程序中,您无法滑动删除行,但仍可以在“编辑”模式下删除行。

当注释掉tableView:commitEditingStyle:forRowAtIndexPath:时,我禁用了要删除的滑动,但在“编辑”模式下仍然具有“删除”按钮,但是当我按下“删除”按钮时会发生什么。什么叫?

Answers:


286

好的,事实证明这很容易。这是我为解决此问题所做的事情:

物镜

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

    return UITableViewCellEditingStyleNone;
}

迅捷2

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

    return .None
}

迅捷3

override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
    if tableView.isEditing {
        return .delete
    }

    return .none
}

您仍然需要实施tableView:commitEditingStyle:forRowAtIndexPath:删除操作。


bu然后轻扫即可自动删除。或不?
Massimo Cafaro 09年

否,如果未处于编辑模式,则不会启用滑动删除功能。这就是为什么我将UITableViewCellEditingStyleNone返回为默认值的原因。
willi 2009年

3
忘了提到,您需要在commitEditingStyle中使用(editingStyle == UITableViewCellEditingStyleDelete):
willi 2009年

好的,使用此语句可以执行删除操作,但是它具有不同的外观。是否有机会以相同的滑动版本视觉效果执行该操作?
Göktuğ咸海

@giuseppe没关系。通过回溯自我,他没有错。该委托方法指的是相同的tableView,因此可以使用or。
史蒂芬·保罗

9

只是为了清楚起见,除非tableView:commitEditingStyle:forRowAtIndexPath:实现,否则不会启用“滑动删除”功能。

在开发过程中,我没有实现它,因此未启用“滑动删除”功能。当然,在完成的应用程序中,它将始终被实施,因为否则将不会进行编辑。


4

迅捷版:

override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}

3

您需要实现CanEditRowAt函数。

您可以在EditingStyleForRowAt函数中返回.delete,因此仍可以在编辑模式下删除。

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    if tableView.isEditing {
        return true
    }
    return false
}

func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
    return .delete
}

2

基本上,您可以使用以下方法启用或禁用编辑

- (void)setEditing:(BOOL)editing animated:(BOOL)animated

如果启用了编辑,则会显示红色的删除图标,并向用户请求删除确认。如果用户确认,则委托方法

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

通知删除请求。如果您实施此方法,则将自动激活“删除”。如果您未实现此方法,则滑动“删除”功能无效,但是您实际上无法删除该行。因此,据我所知,除非使用某些未记录的私有API,否则您将无法实现所需的功能。大概这就是Apple应用程序的实现方式。


1
我通过在tableView中返回UITableViewCellEditingStyleDelete来解决此问题:editingStyleForRowAtIndexPath:如果处于编辑模式。
willi

0

在C#上:

我有一个相同的问题,需要在滑动时使用“删除”选项来启用/禁用行。多行需要向左滑动并删除,使它们保持另一种颜色。我使用了这种逻辑。

[Export("tableView:canEditRowAtIndexPath:")]
public bool CanEditRow(UITableView tableView, NSIndexPath indexPath)
{

    if (deletedIndexes.Contains(indexPath.Row)){
        return false;
    }
    else{
        return true;
    }

}

请注意,deletedIndexes是从表中删除的索引列表,没有重复项。此代码检查是否删除了一行,然后禁用了滑动,反之亦然。

等效的委托函数是Swift is canEditRowAtIndexPath


0

我也遇到了这个问题,并在下面的代码中进行了修复。希望对您有帮助。

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {

    BOOL deleteBySwipe = NO;
    for (UIGestureRecognizer* g in tableView.gestureRecognizers) {
        if (g.state == UIGestureRecognizerStateEnded) {
            deleteBySwipe = YES;
            break;
        }
    }

    if (deleteBySwipe) {
        //this gesture may cause delete unintendedly
        return;
    }
    //do delete
}

}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.