首页 > 解决方案 > 滚动后 SwiftUI 列表单元格未正确显示选择状态

问题描述

编辑:它发生在 iOS 14.2 - 14.5,但不是 14.1 或 14.0。这是一个 SwiftUI 回归。到目前为止,我不知道解决方法。


当用户滚动时,我遇到了 SwiftUI 列表选择问题。滚动到屏幕外然后再次可见的选定单元格不会显示为选中状态。

SwiftUI 列表选择问题

我错过了什么还是这是一个 SwiftUI 错误?

内部 SwiftUI 列表协调器似乎正在使用 UITableView 并且没有正确更新选择状态的单元格状态。

struct Item: Identifiable, Hashable {
    let id: Int
}

class ViewModel: ObservableObject {
  @Published var selectedItems: Set<Int>
  @Published var items: Array<Item>
  
  init() {
    self.items = [Item(id: 1), Item(id: 2), Item(id: 3), Item(id: 4), Item(id: 5),
                  Item(id: 6), Item(id: 7), Item(id: 8), Item(id: 9), Item(id: 10),
                  Item(id: 11), Item(id: 12), Item(id: 13), Item(id: 14), Item(id: 15),]
    self.selectedItems = []
  }
}

struct ContentView: View {
    
    @ObservedObject var context: ViewModel
     
    var body: some View {
//        Alternative also doesn't work.
//        List(context.items, id: \.id, selection: $context.selectedItems) { item in
//            Text("\(item.id)").id(item.id)
//        }
//        .environment(\.editMode, .constant(.active))
        
        List(context.items, selection: $context.selectedItems) { item in
            Text("\(item.id)")
        }
        .environment(\.editMode, .constant(.active))
        
    }
}

控制台输出:

ListSelection[6659:3960182] [Assert] 尝试在表格视图上调用 -cellForRowAtIndexPath: 在更新其可见单元格的过程中,这是不允许的。在 UITableViewAlertForCellForRowAtIndexPathAccessDuringUpdate 处创建一个符号断点以在调试器中捕获此问题并查看导致此问题发生的原因。也许您正试图从表格视图回调中向表格视图询问特定行的单元格?表视图:< TtC7SwiftUIP33_BFB370BA5F1BADDC9D83021565761A4925UpdateCoalescingTableView:0x10381ec00;基类 = UITableView; ...; 数据源:< TtGC7SwiftUIP10$1b198497819ListCoreCoordinatorGVS_20SystemListDataSourceSi_GOS_19SelectionManagerBoxSi:0x10340a930>>

标签: iosswiftlistswiftuiselection

解决方案


这似乎是 14.2-14.3 上的一个 Swift 错误,因为我的应用程序的选择工作正常,但现在它面临着与描述完全相同的视觉问题。


推荐阅读