ios - self.tableView.indexPathForCell(cell) returning wrong cell? -


i have uitableview (multiple sections) custom dynamic cells. each cell has uistepper representing selected quantity.

in order send selected quantity (uistepper.value) cell uitableviewcontroller, have implemented following protocol:

protocol uitableviewcellupdatedelegate {     func celldidchangevalue(cell: menuitemtableviewcell) } 

and ibaction in custom cell uistepper hooked:

@ibaction func pressstepper(sender: uistepper) {      quantity = int(cellquantitystepper.value)      cellquantity.text = "\(quantity)"      self.delegate?.celldidchangevalue(self) } 

and within uitableviewcontroller capture via:

func celldidchangevalue(cell: menuitemtableviewcell) {      guard let indexpath = self.tableview.indexpathforcell(cell) else {         return     }      // update data source - have cell , indexpath     let itemspersection = items.filter({ $0.category == self.categories[indexpath.section] })     let item = itemspersection[indexpath.row]      // quantity cell     item.quantity = cell.quantity         } 

the above setup works well, cases. can't figure out how solve following problem. here's example illustrate:

  1. i set uistepper.value of 3 cell 1 - section 1.
  2. i scroll down bottom of table view cell 1 - section 1 out of view.
  3. i set uistepper.value of 5 cell 1 - section 4.
  4. i scroll top of cell 1 - section 1 view.
  5. i increase uistepper 1. quantity should have been 4. instead, it's 6.

debugging whole thing shows line (in delegate implementation of uitableviewcontroller) gets wrong quantity. seems indexpathforcell getting wrong cell returning wrong quantity?

// cell.quantity wrong item.quantity = cell.quantity 

for completeness sake, here's cellforrowatindexpath implementation cells being dequeued come view:

override func tableview(tableview: uitableview, cellforrowatindexpath indexpath: nsindexpath) -> uitableviewcell {      let cellidentifier = "menuitemtableviewcell"      let cell = tableview.dequeuereusablecellwithidentifier(cellidentifier, forindexpath: indexpath) as! menuitemtableviewcell      cell.delegate = self      // match category (section) items data source     let itemspersection = items.filter({ $0.category == self.categories[indexpath.section] })     let item = itemspersection[indexpath.row]      // cell data     cell.celltitle.text = item.name + "  " + formatter.stringfromnumber(item.price)!     cell.celldescription.text = item.description     cell.cellprice.text = string(item.price)      if item.setzeroquantity == true {         item.quantity = 0         cell.cellquantitystepper.value = 0         cell.cellquantity.text = string(item.quantity)          // reset next time         item.setzeroquantity = false     }     else {         cell.cellquantity.text = string(item.quantity)     }     .....     ....     ..     . } 

you need update stepper value in else clause in cellforrowatindexpath:

else {     cell.cellquantity.text = string(item.quantity)     cell.cellquantitystepper.value = double(item.quantity) } 

otherwise stepper retains value previous time cell used.


Comments

Popular posts from this blog

c++ - llvm function pass ReplaceInstWithInst malloc -

Cross-Compiling Linux Kernel for Raspberry Pi - ${CCPREFIX}gcc -v does not work -

java.lang.NoClassDefFoundError When Creating New Android Project -