Awais
Awais

Reputation: 99

Access selected cell section in delegate function in swift

i'm getting data from API service which i'm passing to my tableview and creating section and cell under it. The number of section and cell are dynamic depends upon the data coming from the service. I have a button on my cell. Button name is add. When i click the add button it shows an alerts which contain a tableview. This table view in alert shows only that data which is related to that particular cell under its section. I have created a delegate method for the button in which i'm getting the indexPath.row of that selected button and pass data from my model to the table view inside the alert. When i click the first cell add button it shows everything fine but when i hit add button from section 2 the cashes. What i observed that app is crashing because compiler only gets indexPath.row but it doesn't get information about which section this cell is. How can i get to know my delegate function that which section cell is selection when add button is pressed. This is my code for the delegate function in my cell class,

protocol ResMenuDetailDelegate {
func addOnBtnTapped(tappedIndex : Int)
}

 var delegate: ResMenuDetailDelegate?

 @IBAction func addBtnTapped(_ sender: Any) {
    delegate?.addOnBtnTapped(tappedIndex: addBtn.tag)
}

In my view controller class here i conform the delegate method,

extension RestaurantMenuDetailVC : ResMenuDetailDelegate{
func addOnBtnTapped(tappedIndex: Int) {

    print(tappedIndex)

    let addonCategory = subCategoryModel![tappedIndex].items[tappedIndex].addonCategory
  print(addonCategory as Any)
}

This is my cellForRow table view delegate,

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

    if tableView == resMenuTableView{

        let cell = resMenuTableView.dequeueReusableCell(withIdentifier: "detailMenuCell", for: indexPath) as! RestaurantMenuDetailTVC

        cell.dishTitleLbl.text = subCategoryModel![indexPath.section].items[indexPath.row].itemName
        cell.descriptionLbl.text = subCategoryModel![indexPath.section].items[indexPath.row].itemDescription
        cell.priceLbl.text = String(subCategoryModel![indexPath.section].items[indexPath.row].itemPrice)
        cell.addBtn.tag = indexPath.row
        cell.delegate = self
        cell.selectionStyle = .none
        cell.backgroundColor = UIColor.clear
        return cell

    }

Upvotes: 2

Views: 2043

Answers (3)

umairhhhs
umairhhhs

Reputation: 410

Change the protocol like that so you could have both values for the row and the section.

    protocol ResMenuDetailDelegate {
    func addOnBtnTapped(tappedIndexRow: Int,tappedIndexSection: Int )
    }
    var delegate: ResMenuDetailDelegate?

 @IBAction func addBtnTapped(_ sender: Any) {
    delegate?.addOnBtnTapped(tappedIndexRow: addBtn.tag,tappedIndexSection: section )
}

Here you can get the section value tableview's delegate method cellForRowAt. Add variable in your custom cell for section

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

        ...
        ...
        cell.addBtn.tag = indexPath.row
        cell.section = indexPath.section
        ...
        ...
    }

Upvotes: 0

Shehata Gamal
Shehata Gamal

Reputation: 100523

You need to send indexpath , the crash because you access the array model section with a row value that exceeds it

func addOnBtnTapped(tappedIndex : IndexPath)

//

extension RestaurantMenuDetailVC : ResMenuDetailDelegate{
 func addOnBtnTapped(tappedIndex: IndexPath) {

   print(tappedIndex)

   let addonCategory = subCategoryModel![tappedIndex.section].items[tappedIndex.row].addonCategory
 print(addonCategory as Any)
}

//

 @IBAction func addBtnTapped(_ sender: Any) {
   delegate?.addOnBtnTapped(tappedIndex:self.myIndexPath)
}

//

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

if tableView == resMenuTableView{

    let cell = resMenuTableView.dequeueReusableCell(withIdentifier: "detailMenuCell", for: indexPath) as! RestaurantMenuDetailTVC

    cell.myIndexPath = indexPath 
 }

//

and declare that var in cell

var myIndexPath:IndexPath!

Upvotes: 3

Khushbu
Khushbu

Reputation: 2430

I think you have to pass two parameters in protocol.

protocol ResMenuDetailDelegate {
func addOnBtnTapped(tappedIndex : Int, button: UIButton)
}

Upvotes: 1

Related Questions