gpt4 book ai didi

ios - dequeueReusableCellWithIdentifier 创建一个新单元格而不是重复使用一个单元格

转载 作者:行者123 更新时间:2023-11-29 01:18:54 25 4
gpt4 key购买 nike

我在带有自定义单元格的 UIViewController 中使用 UITableView。但是,当 dequeueReusableCellWithIdentifier 被调用时,它有时会创建一个新单元而不是重用现有单元。

例如:当第一个单元格第一次更新时,会创建一个新单元格而不是重新使用原始单元格。

我创建了一个图表来帮助更好地说明问题。每个绿色矩形是一个应该发生的 Action ,每个红色矩形是一个不应该发生的 Action 。每个箭头都是对 dequeueReusableCellWithIdentifier 的调用。

diagram example

点击 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()

}

扩展随机颜色的代码

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
}

按钮 Action :

func buttonAction(sender: UIButton) {
print("action for cell : \(sender.tag)")
}

我将代码减少到最大值,在进一步调查后注意到按钮打印了相同的文本,因为我的一个错误我写了两次消息 ^^'所以剩下的唯一问题是“滑动删除”手势

最佳答案

如果我理解正确的话,您在保持操作(的结果)与 tableView 中显示的内容同步方面存在问题。

  • >
    1. 了解 UITableView 如何使用单元格:它会询问 UITableViewCell 的数据源。您可以每次创建一个,也可以向 tableView 请求一个以供重用。由于这种机制,您创建的单元格可以一次出现在某个位置,然后出现在另一个位置。
  • >
    1. 确保您的逻辑和数据始终独立于实际的 tableViewCell。所以你应该能够只用一个 NSIndexPath 来做你必须做的事情。
  • >
    1. UITableViewCell 可以通过两种方法之一为您提供 tableViewCell 的有效索引路径 -indexPathForCell:indexPathForRowAtPoint: .

处理 UITableViewCells 上的操作的方法如下:

  • >
    1. 创建 UITableViewCell 的自定义子类
  • >
    1. 在此子类中创建一个协议(protocol)(例如 MyCellDelegate )
  • >
    1. 给这个类一个属性 delegate类型 id <MyCellDelegte>
  • >
    1. 在数据源中创建单元格时,请将此数据源签名为该单元格的委托(delegate)。
  • >
  • 通过在其委托(delegate)上调用协议(protocol)中的方法(委托(delegate)是您的数据源),让该子类处理操作(滑动/点击)。
  • >
    1. 在该委托(delegate)方法(在数据源上)的实现中,您可以调用 UITableView 上的方法之一来获取索引路径。此时您将独立于实际的 tabelViewCell:使用该 indexPath 来获取数据,或执行特定操作。

尽管对于一件小事来说,这似乎需要做很多工作,但实际上并没有那么多工作,而且您的代码将会更加健壮、更容易遵循并且耦合性更少。

关于ios - dequeueReusableCellWithIdentifier 创建一个新单元格而不是重复使用一个单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34842902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com