【发布时间】:2021-04-23 03:13:40
【问题描述】:
编辑:它发生在 iOS 14.2 - 14.5 上,但不是 14.1 或 14.0。这是一个 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>>
【问题讨论】:
-
您在哪个平台上运行?我刚刚在 iOS 14.1 上尝试过它并且它可以工作(我改变的唯一想法是增加项目数量:
self.items = (0..<100).map(Item.init(id:)))以便它实际滚动。 -
抱歉@JoshHomann 现在才看到你的评论。在 iPhone 12 Mini 上是 14.2.1,在 iPhone 8 / Simulator 和 Xcode 12.2 (12B45b) 上是 14.2。我还没有更新到 12.3,因为我听说它不稳定。的确,更大的屏幕需要更多的项目。下载模拟器后,我将尝试使用 14.1。
-
在 14.1 模拟器上对我来说确实可以正常工作。
标签: ios swift list swiftui selection