UITableView 禁用滑动以快速删除特定单元格

Posted

技术标签:

【中文标题】UITableView 禁用滑动以快速删除特定单元格【英文标题】:UITableView disable swipe to delete for particular cells swift 【发布时间】:2018-03-02 06:08:43 【问题描述】:

我正在尝试禁用滑动以删除表格视图中某些特定单元格的操作。但我无法迅速找到一个好的解决方案。覆盖“tableView.isEditing = true”方法时,我不希望单元格上的左侧减号。这是我的代码。下面的代码没有禁止滑动到 statusId 为“12”的单元格。希望你能理解我的问题。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "identifier", for: indexPath) as! TableViewDateCell
    cell.titleStatus.text = mainList[indexPath.row].statusName
    //tableView.isEditing = true
    //disable swipe to delete for cell with statusId == "12"
    if mainList[indexPath.row].statusId == "12" 
         //tableView.isEditing = false
        cell.selectionStyle = UITableViewCellSelectionStyle.gray
        cell.isUserInteractionEnabled = false

    
 


func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 


【问题讨论】:

【参考方案1】:

您可以自定义UITableViewDelegate 的函数editingStyleForRowAt,尤其是在您不需要滑动时返回UITableViewCellEditingStyle.none,例如:

public func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle

   if mainList[indexPath.row].statusId == "12" 
        return UITableViewCellEditingStyle.none
     else 
        return UITableViewCellEditingStyle.delete
    

【讨论】:

【参考方案2】:

使用这个表视图委托方法

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool 


Documentation tableView:canEditRowAtIndexPath:

【讨论】:

【参考方案3】:

感谢您发布此问题和上述答案。

在扩展答案时,我有一个不应该被删除的默认行,所以我在那个特定的单元格上设置了一个标签,然后首先使用了这个方法。

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool 
    if tableView.cellForRow(at: indexPath)?.tag == 100 
        return false
    
    return true

但是 - 这导致调试器中出现以下警告 -

尝试在表格视图上调用 -cellForRowAtIndexPath: 而它 正在更新其可见单元格,这不是 允许。

所以,正如其他评论员所说,使用下面的这种方法:

Swift 5.0

func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle 
    if tableView.cellForRow(at: indexPath)?.tag == 100 
        return UITableViewCell.EditingStyle.none
     else 
        return UITableViewCell.EditingStyle.delete
    

【讨论】:

太棒了!我面临着相同的错误表视图更新,但现在editingStyleForRowAt 效果很好。谢谢!【参考方案4】:

我在编辑 myTableview 时试图禁用/启用删除功能。 这是我的解决方案:

public func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle

    if !myTableView.isEditing 
        return UITableViewCell.EditingStyle.none
     else 
        return UITableViewCell.EditingStyle.delete
    

【讨论】:

【参考方案5】:

viewDidLoad 中的 Swift 4.2 只需将您的表值设置为...

myTableView.isEditing = false

【讨论】:

以上是关于UITableView 禁用滑动以快速删除特定单元格的主要内容,如果未能解决你的问题,请参考以下文章

在 iphone sdk 中一起滑动以删除和移动 UItableView 选项中的单元格

iOS 7 UITableView 问题 - 当我们已经有一个单元格时尝试设置滑动以删除单元格

当用户没有完全滑动以删除表格视图单元格时,如何禁用/启用编辑按钮?

UITableView 禁用“删除”确认

在 Xamarin IOS 的 UITableview 中更改滑动以删除按钮高度

在uitableview单元格上留下滑动删除按钮打开然后返回导致崩溃