需要帮助了解如何在UIKit中使用UIKit()。文档说
只应重置与内容无关的单元格属性,例如alpha、编辑和选择状态。
但是,重置单个属性(如isHidden )又如何呢?
假设我的手机有两个标签,我应该在哪里重置:
我的tableView(_:cellForRowAt:)委托有条件逻辑来隐藏/显示每个单元格的标签。
发布于 2017-11-27 15:28:58
tldr:使用prepareForReuse取消可以在下载不同indexPath后完成的现有网络调用。对于所有其他意图和目的,只需使用cellForRow(at:。这与苹果的文档略有冲突。但大多数的神都是这样做的。两处都有单元格配置逻辑是不方便的.
苹果文档说,使用它来重置与内容无关的属性。然而,根据经验,只需在cellForRow中为内容做任何事情就更容易了。唯一真正有意义的时候就是
引用苹果的文档 for prepareForReuse
出于性能原因,您应该只重置与内容无关的单元格的属性,例如alpha、编辑和选择状态。
例如,如果选定了一个单元格,您只需将其设置为未选定,如果将背景色更改为某物,则只需将其重新设置为默认颜色即可。
在重用单元格时,
tableView(_:cellForRowAt:)中的表视图的委托应该始终重置所有内容。
这意味着,如果您试图设置联系人列表中的配置文件图像,您不应该尝试在nil中设置prepareforreuse图像,您应该正确地在cellForRowAt中设置图像,如果没有找到任何图像,则将其图像设置为nil或默认图像。基本上,cellForRowAt应该同时控制预期的/意外的状态。
因此,基本上以下是,而不是建议的:
override func prepareForReuse() {
super.prepareForReuse()
imageView?.image = nil
}相反,建议采取以下措施:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)
cell.imageView?.image = image ?? defaultImage // unexpected situation is also handled.
// We could also avoid coalescing the `nil` and just let it stay `nil`
cell.label = yourText
cell.numberOfLines = yourDesiredNumberOfLines
return cell
}此外,建议默认的非内容相关项目如下:
override func prepareForReuse() {
super.prepareForReuse()
isHidden = false
isSelected = false
isHighlighted = false
// Remove Subviews Or Layers That Were Added Just For This Cell
}这样,在运行cellForRowAt时,您可以安全地假设每个单元格的布局是完整的,您只需担心内容。
这是苹果公司的建议。但老实说,我仍然认为,就像马特所说的那样,把所有东西都扔到cellForRowAt里比较容易。干净的代码很重要,但这可能并不能真正帮助您实现这一目标。但是,作为康纳说,唯一必要的时间是,如果您需要取消正在加载的图像。有关更多信息,请参见这里
(如:
override func prepareForReuse() {
super.prepareForReuse()
imageView.cancelImageRequest() // this should send a message to your download handler and have it cancelled.
imageView.image = nil
}发布于 2016-11-23 22:02:27
如文档所述,您只需使用上述方法重置与内容无关的属性。至于重订文本/行数.在您设置新值之前,您可以在tableView(_:cellForRowAt:)中执行此操作,如下所示:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
cell.label.text = "" //reseting the text
cell.label.text = "New value"
return cell
}或
您可以采取一种更面向对象的方法,创建一个UITableViewCell子类,并定义一个方法,比如configureCell()来处理所有重新设置的单元格和新脱队列单元的值设置。
https://stackoverflow.com/questions/40773208
复制相似问题