UITableView禁用滑动删除,但在编辑模式下仍然有删除?

时间:2009-06-09 10:42:56

标签: ios cocoa-touch uitableview uikit

我想要一些类似于闹钟应用程序的东西,你不能滑动删除该行,但你仍然可以在编辑模式下删除该行。

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

7 个答案:

答案 0 :(得分:279)

好的,结果很简单。这就是我为解决这个问题所做的:

<强>目标C

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

    return UITableViewCellEditingStyleNone;
}

Swift 2

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

    return .None
}

Swift 3

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

    return .none
}

您仍然需要实施tableView:commitEditingStyle:forRowAtIndexPath:来提交删除。

答案 1 :(得分:9)

为了清楚起见,除非实施tableView:commitEditingStyle:forRowAtIndexPath:,否则不会启用滑动到删除。

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

答案 2 :(得分:4)

Swift版本:

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

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}

答案 3 :(得分:2)

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

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

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

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

被通知删除请求。如果您实现此方法,则滑动到删除将自动激活。如果未实现此方法,则滑动到删除不活动,但是您无法实际删除该行。因此,据我所知,除非使用一些未记录的私有API,否则无法实现您的要求。可能这就是Apple应用程序的实现方式。

答案 4 :(得分:0)

在C#上:

我遇到了同样的问题,即需要在滑动时使用删除选项启用/禁用行。需要向左滑动多行并将其删除,并将其保留为其他颜色。我实现了使用这种逻辑。

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

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

}

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

等效的委托函数Swift是canEditRowAtIndexPath

答案 5 :(得分:0)

您需要实现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
}

答案 6 :(得分: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
}

}