微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从单元格内部的按钮中删除tableviewcell

如何解决从单元格内部的按钮中删除tableviewcell

我希望我的快速代码使用蓝色按钮删除单元格中的tableview单元格。您可以在gif中看到我要尝试的示例。我也有一个indexPath选择变量。您可能还必须在deleteCell函数中将其删除,我也假设您会使用标签。所有代码都在下面,无需情节提要。

enter image description here

导入UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UIImagePickerControllerDelegate & UINavigationControllerDelegate {
    var arr = [1,1,3,3]
    var tableview = UITableView()
    var selectedindexPath = IndexPath(row: 0,section: 0)
    
    func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
        return 2
    }
    func tableView(_ tableView: UITableView,heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 118
    }

   
    
    
   
    
    
    
    
    
    func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell",for: indexPath) as! customtv
      
  
     
        
        return cell
    }
    
    @objc func deleteCell(){
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        tableview.frame = CGRect(x: 0,y: 0,width: view.frame.width,height: view.frame.height * 0.8)
      
        view.addSubview(tableview)
    

     
        tableview.register(customtv.self,forCellReuseIdentifier: "cell")
        tableview.delegate = self
        tableview.dataSource = self

      
 
        
    }
    
    
    
}

class customtv: UITableViewCell {
    lazy var backView : UIView = {
        let view = UIView(frame: CGRect(x: 10,y: 6,width: self.frame.width,height: 110))
        view.backgroundColor = .green
        
        return view
    }()
    
    lazy var btn : UIButton = {
        let btn = UIButton(frame: CGRect(x: 50,width: 100,height: 110))
        btn.backgroundColor = .blue
        return btn
        
    }()
    
    
    
    override func layoutSubviews() {
        backView.clipsToBounds = true
        backView.frame =  CGRect(x: 0,width: bounds.maxX,height: 110)
        
        
    }

    
    override func setSelected(_ selected: Bool,animated: Bool) {
        super.setSelected(animated,animated: true)
        addSubview(backView)
        backView.addSubview(btn)

    }
    
    
    
}

解决方法

这是我的解决方法:

import UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,CustomTvCellDelegate,UIImagePickerControllerDelegate & UINavigationControllerDelegate {
    
    var cellCount = 2
    var tableview = UITableView()
    var selectedIndexPath = IndexPath(row: 0,section: 0)
    
    func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
        return cellCount // use a variable here so you can change it as you delete cells,else it will crash
    }
    func tableView(_ tableView: UITableView,heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 118
    }
    
    func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell",for: indexPath) as! CustomTv
        cell.delegate = self
        
        return cell
    }
    
    func deleteCell(_ customTV: CustomTv,location: CGPoint) {
        
        // put the button location in an index path array
        var deleteArray = [IndexPath]()
        if let indexPath = tableview.indexPathForRow(at: location) {
            deleteArray.append(indexPath)
        }
        
        cellCount -= 1 // update the row count as you delete a cell
        
        // delete the row using the delete array with a fade animation
        tableview.deleteRows(at: deleteArray,with: .fade)
        
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        tableview.frame = CGRect(x: 0,y: 0,width: view.frame.width,height: view.frame.height * 0.8)
      
        view.addSubview(tableview)
         
        tableview.register(CustomTv.self,forCellReuseIdentifier: "cell")
        tableview.delegate = self
        tableview.dataSource = self
    }
    
}

// you need to declare a cell delegate that will let your tableview know when the button was tapped on the cell
protocol CustomTvCellDelegate: AnyObject {
    func deleteCell(_ customTV: CustomTv,location: CGPoint)
}

class CustomTv: UITableViewCell { // it's good form to Pascal case your class name ;)
    
    weak var delegate: CustomTvCellDelegate? // make that delegate a property of your cell
    
    lazy var backView : UIView = {
        let view = UIView(frame: CGRect(x: 10,y: 6,width: self.frame.width,height: 110))
        view.backgroundColor = .green
        
        return view
    }()
    
    lazy var btn : UIButton = {
        let btn = UIButton(frame: CGRect(x: 50,width: 100,height: 110))
        btn.backgroundColor = .blue
       
        return btn
        
    }()
    
    override func layoutSubviews() {
        backView.clipsToBounds = true
        backView.frame =  CGRect(x: 0,width: bounds.maxX,height: 110)
        
        // moved these calls here instead of on setSelected(_selected:animated:)
        addSubview(backView)
        backView.addSubview(btn)
        
        btn.addTarget(self,action:#selector(self.deleteCell),for: .touchUpInside)
    }
    
    @objc func deleteCell(sender: UIButton){
        // let your cell delegate (tableview) know what the button got tapped,you need to pass the button here)
        let buttonLocation = sender.superview?.convert(sender.frame.origin,to: nil) ?? CGPoint.zero
        delegate?.deleteCell(self,location: buttonLocation)
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。