【问题标题】:UICollectionViewCell is automatically deselected immediately after setting isSelected to true on iOS 15在 iOS 15 上将 isSelected 设置为 true 后,UICollectionViewCell 会立即自动取消选择
【发布时间】: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


    【解决方案1】:

    你不应该自己设置.isSelected

    UICollectionView 跟踪选定的单元格并设置.isSelected 何时显示每个单元格。

    “预选”单元格的正确方法是调用(例如,在viewDidLoad() 的末尾):

    let preSelectPath = IndexPath(item: 2, section: 0)
    collectionView.selectItem(at: preSelectPath, animated: false, scrollPosition: .top)
    

    显然,将索引路径值更改为您想要选择的单元格,并将.top 替换为您想要的滚动位置。

    【讨论】:

    • 谢谢,这解决了。我需要做一些重构来解决这个问题,但显然在早期的 iO​​S 版本上直接设置 isSelected 工作(意外或其他),它不再像以前那样工作。 selectItem() 现在是正确的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多