Ios Swift-点击按钮后从TableView中删除单元格

Ios Swift-点击按钮后从TableView中删除单元格,ios,swift,uitableview,Ios,Swift,Uitableview,在我的项目中,我有一个UITableView。其中的单元格包含一个ui按钮,该按钮的作用类似于一个“复选框”,因此用户可以勾选任务 我的问题:在用户按下ui按钮后,如何删除单元格 这是我的customCell: import UIKit class WhishCell: UITableViewCell { let label: UILabel = { let v = UILabel() v.font = UIFont(name: "AvenirNext"

在我的项目中,我有一个
UITableView
。其中的
单元格
包含一个
ui按钮
,该按钮的作用类似于一个“复选框”,因此用户可以勾选任务

我的问题:在用户按下
ui按钮后,如何删除
单元格

这是我的
customCell

import UIKit

class WhishCell: UITableViewCell {

    let label: UILabel = {
       let v = UILabel()
        v.font = UIFont(name: "AvenirNext", size: 23)
        v.textColor = .white
        v.font = v.font.withSize(23)
        v.translatesAutoresizingMaskIntoConstraints = false
        return v
    }()

        let checkButton: UIButton =  {
        let v = UIButton()
        v.backgroundColor = .darkGray
//        v.layer.borderColor = UIColor.red.cgColor
//        v.layer.borderWidth = 2.0
        v.translatesAutoresizingMaskIntoConstraints = false
        v.setBackgroundImage(UIImage(named: "boxUnchecked"), for: .normal)

        return v
    }()



        public static let reuseID = "WhishCell"

        required init?(coder: NSCoder) {fatalError("init(coder:) has not been implemented")}

        override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
            super.init(style: style, reuseIdentifier: reuseIdentifier)

            self.backgroundColor = .clear

            // add checkButton
            self.contentView.addSubview(checkButton)
            self.checkButton.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 20).isActive = true
            self.checkButton.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
            self.checkButton.widthAnchor.constraint(equalToConstant: 40).isActive = true
            self.checkButton.heightAnchor.constraint(equalToConstant: 40).isActive = true
            self.checkButton.addTarget(self, action: #selector(checkButtonTapped), for: .touchUpInside)
            // add label
            self.contentView.addSubview(label)
            self.label.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 70).isActive = true
            self.label.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true



        }

        @objc func checkButtonTapped(){
            self.checkButton.setBackgroundImage(UIImage(named: "boxChecked"), for: .normal)
            self.checkButton.alpha = 0
            self.checkButton.transform =  CGAffineTransform(scaleX: 1.3, y: 1.3)

            UIView.animate(withDuration: 0.3) {
                self.checkButton.alpha = 1
                self.checkButton.transform = CGAffineTransform.identity
            }


        }
    }

创建单元格并设置按钮选择器时,只需按如下方式设置按钮标记和选择器:

self.checkButton.tag = indexPath.row
self.checkButton.addTarget(self, action: #selector(checkButtonTapped(sender:)), for: .touchUpInside)
并在选择器中进行更改:

@objc func checkButtonTapped(sender : UIButton){
   let index = sender.tag
    self.tableView.deleteRows(at: [index], with: .automatic)  

   //Add all your code here..


  }

谢谢

您可以使用此扩展访问单元格中的
表格视图
索引XPath

extension UITableViewCell {
    var tableView: UITableView? {
        return (next as? UITableView) ?? (parentViewController as? UITableViewController)?.tableView
    }

    var indexPath: IndexPath? {
        return tableView?.indexPath(for: self)
    }
}
extension UIView {
    var parentViewController: UIViewController? {
        var parentResponder: UIResponder? = self
        while parentResponder != nil {
            parentResponder = parentResponder!.next
            if let viewController = parentResponder as? UIViewController {
                return viewController
            }
        }
        return nil
    }
}
在其他扩展的帮助下:

extension UITableViewCell {
    var tableView: UITableView? {
        return (next as? UITableView) ?? (parentViewController as? UITableViewController)?.tableView
    }

    var indexPath: IndexPath? {
        return tableView?.indexPath(for: self)
    }
}
extension UIView {
    var parentViewController: UIViewController? {
        var parentResponder: UIResponder? = self
        while parentResponder != nil {
            parentResponder = parentResponder!.next
            if let viewController = parentResponder as? UIViewController {
                return viewController
            }
        }
        return nil
    }
}
因此,您可以像往常一样删除单元格:

tableView!.deleteRows(at: [indexPath!], with: .automatic)  
请注意表视图应负责管理单元格。

快速的方法是回调关闭

在单元格中添加一个属性

var callback : ((UITableViewCell) -> Void)?
在操作中,调用回调并传递单元格

@objc func checkButtonTapped(){


    ...     
    callback?(self)
}
cellForRowAt
中的控制器中,为回调属性分配一个闭包

cell.callback = { cell in
    let indexPath = tableView.indexPath(for: cell)!
    // insert here a line to remove the item from the data source array.
    tableView.deleteRows(at: [indexPath], with: .automatic) 
}

本机Swift解决方案比分配标记、objective-c-ish目标/操作或繁琐的视图层次结构数学效率更高。

更改带有此选项的复选按钮

@objc func checkButtonTapped() {
        self.checkButton.setBackgroundImage(UIImage(named: "boxChecked"), for: .normal)
        self.checkButton.alpha = 0
        self.checkButton.transform =  CGAffineTransform(scaleX: 1.3, y: 1.3)

        UIView.animate(withDuration: 0.3) {
            self.checkButton.alpha = 1
            self.checkButton.transform = CGAffineTransform.identity
        }

        if let tableView = self.superview as? UITableView {
            let indexPath = tableView.indexPath(for: self)
            tableView.dataSource?.tableView!(tableView, commit: .delete, forRowAt: indexPath!)
        }
    }

并将下一个方法添加到UITableViewDelegate实现中

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            print("Deleted")

            self.texts.remove(at: indexPath.row)
            self.tableview.deleteRows(at: [indexPath], with: .automatic)
        }
    }

我无法设置
checkButton.Tag=indexPath.row
,因为我无法访问我的
cell类中的
indexPath.row
,它无法识别
parentViewController
很抱歉,我忘了发布其他帮助程序扩展。更新。我在执行此操作时遇到问题。My
UITableView
在My
WishlistTableViewController
类中。我必须在你的代码中更改什么?你根本不需要更改任何东西!这些是扩展,扩展您正在使用的每个
UIView
UITableViewCell
。没有别的事了。只需实现这两个扩展和boom,就可以访问tableViewCell内部的
tableView
indexPath