【发布时间】:2022-08-08 21:01:32
【问题描述】:
我们有一个 UICollectionViewCell 在屏幕加载时手动选择。在屏幕的生命周期内应始终选择此单元格,并且在集合视图的此特定部分中始终只有一个单元格。
override public func cellForItem(at index: IndexPath) -> UICollectionViewCell {
let cell = collectionContext.dequeueReusableCell(withReuseIdentifier: cellStyle.reuseIdentifier, for: index) as! AccountSelectorSavingsPotAccountCompactCell
cell.configure(for: savingsPot.savingsAccount)
cell.isReadOnlyCell = true
cell.isSelected = true
return cell
}
请注意, .isReadOnlyCell 不会改变问题。使用 .isSelected 切换顺序,甚至完全删除该行,都不能解决问题。
在这里,我们在单元格本身上有覆盖的“isSelected”:
override public var isSelected: Bool {
didSet {
if self.isSelected == false {
self.selectedPotUUID = nil
}
styleView(selected: self.isSelected, showTableIfSelected: !self.isReadOnlyCell)
if self.account != nil {
self.potsTableView.reloadData()
}
}
}
在 iOS 13 上,将 cell.isSelected 设置为 true 后,一切都很好,并且单元格保持选中状态。但是,在 iOS 15 上,发生这种情况后,会再次触发 didSet{},这一次是因为 isSelected 设置为 false。
这只发生在 iOS 15 上(我没有在 14 上测试过),当第二个事件发生时,堆栈跟踪对我没有帮助。它没有显示 isSelected 被设置为 false 的位置,并且其他可能暗示 reloadData() 在某处被调用的断点不会触发。我相信由于某些生命周期问题,该单元格会再次自动设置为 false,但我无法追踪可能发生这种情况的位置。缺少堆栈跟踪也很神秘。
这是 iOS 15 的一个已知问题,还是我忽略了一些事件?
【问题讨论】:
标签: ios swift uicollectionview uicollectionviewcell