Swift 通过单击图像删除表行

Swift 通过单击图像删除表行,swift,uitableview,Swift,Uitableview,我有以下职能: func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { myItemsInCart.remove(at: indexPath.row) tableView.reloadData()

我有以下职能:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath)
{
    if editingStyle == .delete
    {
        myItemsInCart.remove(at: indexPath.row)
        tableView.reloadData()
    }
}

@objc func removeTapped(tapGestureRecognizer: UITapGestureRecognizer){
    let removeImage = tapGestureRecognizer.view as! UIImageView
    print("my taped image view tag is : \(removeImage .tag)")

}
默认情况下,我可以通过向左滑动删除行:


但是我想通过单击删除图标而不是滑动来删除单元格。

您可以创建一个协议来完成此操作。这只是实现这一点的多种方法之一

  • 使UITableViewController遵守协议
  • 将indexPath和委托属性添加到单元格中
  • 在cellForIndexPath中,设置单元格的委托和indexPath属性
  • 在cells子类中,将一个目标添加到按钮中,该按钮在按下时调用单元格委托的deleteCell函数 代码:

    class MyTableViewController: ItemCellDelegate {  
        func deleteCell(cell: ItemCell) {
            let indexPath = tableView.indexPath(for: cell)
            myItemsInCart.remove(at: indexPath.row)
            tableView.reloadData()
        }  
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! ItemCell
            cell.delegate = self
            return cell
        }
    } 
    
    
    protocol ItemCellDelegate {
        var delegate: UIViewController? { get set }
        func deleteCell(cell: ItemCell)
    }
    
    class ItemCell: UITableViewCell {
        var indexPath: IndexPath?
        var delegate: ItemCellDelegate?
        @objc func deleteCell(_ sender: Any?) {
            delegate?.deleteCell(cell: self)
        }
        override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
            super.init(style: style, reuseIdentifier: reuseIdentifier)
            deleteButton.addTarget(self, action: #selector(deleteCell), for: .touchUpInside)
        }
    }
    

    移除图标是否为
    ui按钮
    ?否,-
    ui图像视图
    尝试将其更改为
    ui按钮
    ,按下按钮后,您可以调用委托函数移除
    UITableViewCell
    。此解决方案方向正确,但存在缺陷。永远不要告诉单元格其索引路径,因为它可能会更改,尤其是在插入、删除或移动行时。更改单元格的协议,使参数为单元格本身而不是索引路径。然后,
    cellForRowAt
    只需设置委托即可。然后,委托方法的实现将获得单元格。当需要时,您可以直接在表视图中查询单元格的索引路径。这是一个很好的观点。我更新了从tableView中获取indexPath的方法,将其传递给单元格,而不是将其设置为属性并传递回。1) 不要仅仅为了删除一行而调用
    reloadData
    。在处使用
    。2) 将
    deleteCell(cell:UITableViewCell)
    更改为
    deleteCell(cell:ItemCell)
    。它特定于
    ItemCell
    类,因此没有理由将参数保留为泛型。关于协议单元类型的另一个优点是。至于删除一行,你肯定是对的,但我只是让它和OP的一样。