与 collectionView.reloadItems[at: [indexPath]] 重叠标签值
Posted
技术标签:
【中文标题】与 collectionView.reloadItems[at: [indexPath]] 重叠标签值【英文标题】:Overlapping label value with collectionView.reloadItems[at: [indexPath]] 【发布时间】:2018-10-24 06:09:44 【问题描述】:我有一个带有原型单元的 CollectionView。单元格有一个标签。标签经常随时间改变值。我用collectionView.reloadItems[at: [indexPath]]
重新加载数据,我的问题是当我使用此方法更新集合视图中的标签时,当标签正在更新他的值时,我眨眼之间就会重叠值:如图所示:
当我使用collectionView.reloadData()
方法时,我没有这个问题。但是更新集合视图需要更多的 CPU 能力和时间。
更多代码: 在这里我收集单元格的新数据并将其发送到我的 updateCell 函数:
let btesMeter:[UInt8] = [data![7], data![6], data![5], data![4]]
let resultMeter = (UInt32(btesMeter[3]) << 24) + (UInt32(btesMeter[2]) << 16) + (UInt32(btesMeter[1]) << 8) + UInt32(btesMeter[0])
let tempresultMeter = resultMeter / 1000
updateCell(cellname: "Kilometerstand", newValue: String(tempresultMeter))
这是我的 UpdateCel 函数:
func updateCell(cellname: String, newValue: String)
let cell = cellname
if let cellname = periodicData.first(where: $0.title == cell)
if cellname.value == newValue
return
else
cellname.value = newValue
if let indexOf = periodicData.firstIndex(where: $0.title == cell)
// Reload the index
let indexPath = IndexPath(item: indexOf, section: 0)
let array:[IndexPath] = [indexPath]
collectionView.reloadItems(at: array)
cellForItemAt:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CustomCollectionViewCell
cell.labelTitle.text = periodicData[indexPath.row].title
cell.labelValue.text = periodicData[indexPath.row].value
return cell
CustomCollectionViewCell:
class CustomCollectionViewCell: UICollectionViewCell
@IBOutlet weak var labelTitle: UILabel!
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var labelValue: UILabel!
【问题讨论】:
【参考方案1】:我没有关于你的代码的足够信息,但这个问题是
prepareForReuse()
可以修复。
执行任何必要的清理以准备视图以供使用again。
在您的自定义单元格类中覆盖此函数,并清理任何UILabel
,
每次重新加载或出列单元格时,您都会触发此功能。
您将要做什么的示例。
override func prepareForReuse()
super.prepareForReuse()
label.text = "" // cleans up the text inside the label to reuse again
更新:如果上述方法不起作用,
您可能需要在调用reloadData
之前清除您的数据源。
您产生此效果的原因是您用于确定集合视图中项目和部分数量的源中仍有旧数据。
验证这一点的简单方法是在调用 reloadData
之前对数据源的内容进行 NSLog 记录。
OP
希望这会有所帮助!
【讨论】:
我已经测试过了,但没有区别。 prepareForReuse() 也仅适用于不在视图中的单元格。就像滚动 collectionView 并且某些单元格不在可见视图中时一样,而不是 prepareForReuse() 方法为不在可见视图中的特殊单元格抛出。 在问题中提供更多代码,以便我们 .可以去看看 更新了我的代码 Datasource 与 reloadItems() 前后相同。唯一的区别是一个值:“Kilometerstand”。使用 reloadItems() 我只更新存在“Kilometerstand”旧值的特定单元格。所以这不是问题。我标签上的重叠只有一毫秒,您只能在从该应用程序进行屏幕录制时看到它,并在值更改时暂停它。以上是关于与 collectionView.reloadItems[at: [indexPath]] 重叠标签值的主要内容,如果未能解决你的问题,请参考以下文章