ios - Setting label with property observer in UITableViewCell, what's happening -
ios - Setting label with property observer in UITableViewCell, what's happening -
in custom uitableviewcell when property set, if there no label create label , set text etc. if label exists, shouldn't anything. unusual thing is, when tap cell first time creates label should be. when tap cell again, label disappears. i've recreated in clean project , same thing happening. what's cause of odd behavior?
customtableviewcell:
class tableviewcell: uitableviewcell { var numberlabel: uilabel! var views = [string: uilabel]() var number: int = 5 { didset { println("amount: accessed") if numberlabel == nil { println("amount: amount nil") // create amount label numberlabel = uilabel() if number > 0 { numberlabel.text = string(number) } numberlabel.settranslatesautoresizingmaskintoconstraints(false) contentview.addsubview(numberlabel) views["amount"] = numberlabel // amount label constraints contentview.addconstraint(nslayoutconstraint(item: numberlabel, attribute: .centery, relatedby: .equal, toitem: contentview, attribute: .centery, multiplier: 1, constant: 0)) contentview.addconstraints(nslayoutconstraint.constraintswithvisualformat("h:[amount(40)]-8-|", options: nil, metrics: nil, views: views)) } else { println("amount: nil should changing or happening \n") } } } required init(coder adecoder: nscoder) { fatalerror("nscoding not supported") } override init(style: uitableviewcellstyle, reuseidentifier: string?) { super.init(style: style, reuseidentifier: reuseidentifier) } } viewcontroller:
class viewcontroller: uiviewcontroller, uitableviewdatasource, uitableviewdelegate { @iboutlet weak var tableview: uitableview! var items = [int]() var amount = 0 override func viewdidload() { super.viewdidload() tableview.registerclass(tableviewcell.self, forcellreuseidentifier: "cell") } func tableview(tableview: uitableview, numberofrowsinsection section: int) -> int { homecoming 1 } func tableview(tableview: uitableview, cellforrowatindexpath indexpath: nsindexpath) -> uitableviewcell { allow cell = tableview.dequeuereusablecellwithidentifier("cell", forindexpath: indexpath) tableviewcell cell.number = amount homecoming cell } func tableview(tableview: uitableview, didselectrowatindexpath indexpath: nsindexpath) { amount++ tableview.reloadrowsatindexpaths([indexpath], withrowanimation: .fade) } } edit: in response comment, console displays:
number: accessed number: number nil number: accessed number: number nil << label shows "1" number: accessed number: nil should changing or happening << label disappears. number: accessed number: nil should changing or happening << label shows "1" 1 time again number: accessed number: nil should changing or happening << label disappears. number: accessed number: nil should changing or happening << label shows "1" 1 time again number: accessed number: nil should changing or happening << label disappears. i changed background color , disappears. suppose has oldvalue of didset. same happening willset when alter values newvalue. nil happens when utilize "old values" though.
i believe downwards repeated reuse of same 2 cells:
your table has 1 row, end creating 2 cells scratch clear initial output. creates 2 because reload while using first cell, forcing sec created.
the first cell (a) have number 0 , blank label. sec cell (b) have number 1 , label 1 in it.
when next select, table reuses cell has blank text. regardless of number blank never reset number cell has label already.
when next select, table reuses cell b has text 1.
this pattern repeats because using 1 cell while calling reload reuses other. hence a,b,a,b.....
to prepare problem, need set label content every time set number.
ios uitableview swift custom-cell didset
Comments
Post a Comment