简体   繁体   中英

How to get JSON id with button in tableview cell in swift4

I'm using tableView cell with button name of delete and I want to delete my JSON data from tableView cell I need to so That JSON ID to delete the JSON data from my Tableview . I'm using to get the JSON ID for that indexPath in didSelect row function. but the problem is I can't get JSON Id from that indexPath without pressing the row.

var selectedList: JSONList?

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    selectedList = JSONList[indexPath.row]
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = Tableview.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? TableviewCell

    cell?.Numbers.text = JSONList[indexPath.row].Number

    cell?.Trash.addTarget(self, action: #selector(Deleting), for: .touchUpInside)


    cell?.selectionStyle = .none
    return cell!
}

//here is my delete function calling

func Deleting() {

let selectedListObj = selectedList
    print(selectedListObj!.id)
}

First of all set a tag to the button which it will be in your case the row of the IndexPath , add this code in cellForRowAt :

cell?.Trash.addTarget(self, action: #selector(deleting(_:)), for: 
.touchUpInside)
cell?.Trash.tag = indexPath.row

You need to modify the deleting() function to be @objc since selectors after swift 3+ are a must to add that and add the button as param into it:

@objc private func deleting(_ button:UIButton){

    // here you got the object
    let selectedObject = JSONList[button.tag]

}

use closure to get the tapped buttons cells indexpath.

update the table view cell with ibaction and call the closure whenever tapping on trash button.

class FakeTableCell: UITableViewCell{

  var selectedCell: ((UITableViewCell) -> ())?

  @IBAction func trashButtonTapped(){
    selectedCell?(self)
  }
} 

then we can get the indexpath of the cell in cell for row for indexpath as follows

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = FakeTableCell()
    cell.selectedCell = { selectedCell in
        if let ip = tableView.indexPathForRow(at: selectedCell.center){
            self.deleteData(with: ip.row)
        }
    }
    return cell
}


 func deleteData(with row: Int){
    // get the object by JSONList[row]
    let item = JSONList[row]
    // perform deletion
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM