ChatGPT解决这个技术问题 Extra ChatGPT

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

我想要类似于警报应用程序的东西,您不能在其中滑动删除行,但您仍然可以在编辑模式下删除行。

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


p
phatmann

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

Objective-C

- (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 然后滑动删除再次自动启用。或不?
不,如果不在编辑模式下,则不会启用滑动删除。这就是我默认返回 UITableViewCellEditingStyleNone 的原因。
忘了在 commitEditingStyle 中提到你需要 if (editingStyle == UITableViewCellEditingStyleDelete):
好的,通过此语句,您可以执行删除操作,但它具有不同的视觉效果。是否有机会以与滑动版本相同的视觉效果进行该操作?
@giuseppe没关系。他提到自我并没有错。该委托方法指的是同一个 tableView,所以他可以使用 or 。
M
Marc Rochkind

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

在开发过程中,我没有实现它,因此没有启用滑动删除。当然,在一个完成的应用程序中,它总是会被实现,否则就没有编辑。


N
Noodybrank

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

k
kareem

斯威夫特版本:

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

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}

M
Massimo Cafaro

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

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

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

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

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


我通过在 tableView 中返回 UITableViewCellEditingStyleDelete 解决了这个问题:editingStyleForRowAtIndexPath: 如果它处于编辑模式。
A
Alvin George

在 C# 上:

我遇到了同样的问题,需要在滑动时使用删除选项启用/禁用行。多行需要向左滑动并被删除,将它们保持为另一种颜色。我使用这个逻辑实现了。

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

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

}

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

等效的委托函数是 Swift 是 canEditRowAtIndexPath


u
user4272677

我也遇到了这个问题,并用下面的代码修复了。希望它会帮助你。

- (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
}

}


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅