我在UITableView
内使用自定义单元格中的UIViewController
。但是,当调用dequeueReusableCellWithIdentifier
时,它有时会创建一个新单元格,而不是重用现有单元格。
例如:当第一个单元格第一次更新时,会创建一个新单元格,而不是重新使用原始单元格。
我创建了一个图表来帮助更好地说明问题。每个绿色矩形都是应该发生的动作,每个红色矩形都是不应该的。每个箭头都是dequeueReusableCellWithIdentifier
的调用。
当点击UIButton
时(多次调用该动作),并且通过“轻扫以删除”动作,新的第二个单元格可以覆盖已刷过的单元格,这会产生问题看起来删除按钮随机消失。
我该如何解决这个问题?
修改
代码自定义单元格
class TableViewCell : UITableViewCell{
@IBOutlet weak var buttonStop: UIButton!
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
print("newCell")
backgroundColor = color
}
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
override func prepareForReuse() {
super.prepareForReuse()
}
var color = UIColor().randomColor()
}
扩展名randomColor的代码
extension UIColor {
func randomColor() -> UIColor {
let aRedValue = CGFloat(arc4random()) % 255 / 255
let aGreenValue = CGFloat(arc4random()) % 255 / 255
let aBlueValue = CGFloat(arc4random()) % 255 / 255
return UIColor(red: aRedValue, green: aGreenValue, blue: aBlueValue, alpha: 1)
}
cellForRow的代码
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCellWithIdentifier("Cell",forIndexPath: indexPath) as! TableViewCell
cell.buttonStop.tag = indexPath.row
cell.buttonStop.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside)
return cell
}
buttonAction:
func buttonAction(sender: UIButton) {
print("action for cell : \(sender.tag)")
}
我将代码缩小到最大值,注意在进一步调查后按钮打印了相同的文本,因为我的一个错误我写了两次消息^^' 因此剩下的唯一问题是“滑动删除”手势
答案 0 :(得分:1)
如果我理解正确,那么保持(结果)动作与tableView中显示的内容同步有问题。
-indexPathForCell:
或indexPathForRowAtPoint:
之一为tableViewCell提供有效的indexPath。MyCellDelegate
)delegate
id <MyCellDelegte>
虽然这对于一件小事来说似乎有很多工作,但实际上并没有那么多工作,而且你的代码会更强大,更容易理解并且更少耦合。