微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

滚动后 SwiftUI 列表单元格未正确显示选择状态

如何解决滚动后 SwiftUI 列表单元格未正确显示选择状态

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


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

SwiftUI List Selection issue

是我遗漏了什么还是这是一个 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; baseClass = UITableView; ...;数据源:TtGC7SwiftUIP10$1b198497819ListCoreCoordinatorGVS_20SystemListDataSourceSi_GOS_19SelectionManagerBoxSi:0x10340a930>>

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?