Johny Gargano
Johny Gargano

Reputation: 45

delete tableview cell from button inside it

I want my swift code to delete the tableview cell from the button inside the cell. If the user hits the delete button from the cell with the label containing 2 it should delete that cell. So you would see the cells of 0,1,3,4. The delete button should not delete the cell that is at the bottom of the cell. Each delete bottom should only delete that cell. I think you would create a specific function in class view controller to do this.

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var numberOfRows = 5

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { numberOfRows }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 118 }

    var tableView = UITableView()
    var selectedIndexPath = IndexPath(row: 0, section: 0)

    override func viewDidLoad() {
        super.viewDidLoad()

        setTableVIew()
    }


    func setTableVIew(){
    
          
         
       
        
        let VCframe = view.frame
        let height = VCframe.height * 0.8
           
        let widthx = VCframe.width

   
             tableView.frame = CGRect(x: 10, y: 0, width: widthx - 20, height: height)
          
        tableView.delegate = self
        tableView.dataSource = self
        view.addSubview(tableView)
  
      
        tableView.register(customtv.self, forCellReuseIdentifier: "cell")
    }
 

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! customtv
       //cell.textLabel?.text = "\(indexPath.row)"   // Don't Do this.
       cell.lbl.text = "\(indexPath.row)"            // Do this.

       return cell
   }


    
}
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
      print(self.frame.width)
          return view
      }()
      

      
      override func layoutSubviews() {
         backView.clipsToBounds = true
         backView.frame =  CGRect(x: 0, y: 6, width: bounds.maxX  , height: 110)
   

      }
    lazy var lbl : UILabel = {
        let press = UILabel(frame: CGRect(x: 0, y: 3, width: 120 , height: 50))
        press.backgroundColor = .yellow
        press.text = String("1")
            
        return press
    }()

   
 


 
    lazy var deleteBTN : UIButton = {
        let press = UIButton(frame: CGRect(x: 200, y: 3, width: 65 , height: 50))
        press.backgroundColor = .systemBlue
        press.setTitle("DELETE", for: .normal)

        return press
    }()

 

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

Upvotes: 0

Views: 2901

Answers (1)

Shehata Gamal
Shehata Gamal

Reputation: 100503

Instead of

var numberOfRows = 5

use an array

var arr = [0,1,2,3,4]

Then

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return arr.count 
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! customtv
   cell.lbl.text = "\(arr[indexPath.row])"  
   cell.deleteBTN.tag = indexPath.row
   cell.deleteBTN.addTarget(self, action:#selector(delete(_:)), for: .touchUpInside) 
   return cell
}
@objc func handleRegister(_ sender: UIButton){
     arr.remove(at:sender.tag)
     tableView.deleteRows(at:[Indexpath(row:sender.tag,section:0)],with:.none)
}

Upvotes: 1

Related Questions