gpt4 book ai didi

ios - 在 UITableViewCell 中使用属性观察器设置标签,发生了什么

转载 作者:行者123 更新时间:2023-11-28 05:29:22 24 4
gpt4 key购买 nike

在我的自定义 UITableViewCell 中设置属性时,如果没有标签,它将创建一个标签并设置文本等。如果标签已经存在,它不应该做任何事情。奇怪的是,当我第一次点击单元格时,它会按原样创建标签。但是当我再次点击单元格时,标签消失了。我在一个干净的项目中重新创建了它,同样的事情正在发生。这种奇怪行为的原因是什么?

自定义表格 View 单元格:

class TableViewCell: UITableViewCell {

var numberLabel: UILabel!
var views = [String: UILabel]()

var number: Int = 5 {
didSet {
println("AMOUNT: Accessed")
if numberLabel == nil {
println("AMOUNT: Amount is 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: Nothing should be 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)
}
}

View Controller :

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 { return 1 }

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as TableViewCell

cell.number = amount

return cell
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
amount++
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
}
}

编辑:作为对该评论的回应,我的控制台显示:

NUMBER: Accessed
NUMBER: Number is nil
NUMBER: Accessed
NUMBER: Number is nil << label shows "1"
NUMBER: Accessed
NUMBER: Nothing should be changing or happening << label disappears.

NUMBER: Accessed
NUMBER: Nothing should be changing or happening << label shows "1" again

NUMBER: Accessed
NUMBER: Nothing should be changing or happening << label disappears.

NUMBER: Accessed
NUMBER: Nothing should be changing or happening << label shows "1" again

NUMBER: Accessed
NUMBER: Nothing should be changing or happening << label disappears.

我还将背景更改为一种颜色,它就消失了。我想这与 didSet 的 oldValue 有关。当我将值更改为 newValue 时,willSet 也会发生同样的情况。但是,当我使用“旧值”时没有任何反应。

最佳答案

我相信这归因于重复使用相同的两个单元格:

您的表格只有一行,但您最终从头开始创建了两个单元格,这在初始输出中是清楚的。它可能会创建两个,因为您在使用第一个单元格时重新加载,从而强制创建第二个单元格。

第一个单元格 (A) 将包含数字 0 和一个空白标签。第二个单元格 (B) 将包含数字 1 和一个包含 1 的标签。

当您进行下一次选择时,表格会重新使用具有空白文本的单元格 A。无论数字是多少,这都将始终为空白,因为您永远不会为已经有标签的单元格重置数字。

当您进行下一次选择时,表格会重新使用包含带有 1 的文本的单元格 B。

此模式随后会重复,因为您总是在使用一个单元格的同时调用重新加载,而重新加载会重用另一个单元格。因此 A,B,A,B.....

修复该问题,每次设置数字时都需要设置标签内容。

关于ios - 在 UITableViewCell 中使用属性观察器设置标签,发生了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29500802/

24 4 0