swift UIViewRepresentable:从updateUIView复制UICollectionView中的数据失败,应用程序崩溃

vxbzzdmp  于 2023-10-15  发布在  Swift
关注(0)|答案(1)|浏览(100)

我正在使用一个UICollectionView作为UIViewRepresentable。当当前项目发生更改(滚动到当前项目并突出显示)或源数据更新(可以添加/删除一个项目)时,它应该更新。第一种情况工作得很好,但第二种情况可能会导致滞后,甚至导致应用程序崩溃,但有以下例外:“尝试将集合视图滚动到越界项目(9),但第0节中只有9个项目”。在更新源数据(添加/删除项目)后滚动时引起。
下面是updateUIView函数的代码:

func updateUIView(_ uiView: UICollectionView, context: Context) {
        uiView.reloadData()

        if !sections.isEmpty, currentSectionId != context.coordinator.currentSectionIndex && uiView.numberOfItems(inSection: 0) == sections.count {
            context.coordinator.currentSectionIndex = currentSectionId
            
            guard let currentSection = sections.firstIndex(where: { $0.id == currentSectionId }) else { return }
            let indexPath = IndexPath(row: currentSection, section: 0)

            uiView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
        }
    }

下面是我的UIViewRepresentable的变量:

struct SectionScrollView: UIViewRepresentable {
    @Binding var sections: [MenuSection]
    @Binding var currentSectionId: Int

这是一个可以在类别中导航的菜单,因此滚动主菜单(也是UIViewRepresentable UICollectionView)会触发currentSectionId,将节集合视图滚动到当前节。在节集合视图中按下当前节会触发主集合视图滚动到当前节的开始。
此外,使一个项目的收藏夹添加额外的部分(如果没有收藏夹),并删除它(如果用户删除最后一个项目从收藏夹)。这里的**是异常出现的时候。如果用户在收藏项目后滚动主收藏视图,应用程序可能会崩溃(或无法崩溃)。
reloadData()似乎并不总是工作或按预期工作。
那么,这里会有什么问题呢?
P.S.当我将下面的代码添加到updateUIView时,滚动有时会停止,直到另一个最喜欢的菜没有添加/删除:

uiView.reloadData() // This was already there

if sections.count != uiView.numberOfItems(inSection: 0) {
    uiView.reloadData()
}
gcuhipw9

gcuhipw91#

reloadData应该在主线程上执行(你不应该在updateUIView中调用它)查看在UIViewRepresentable中创建协调器

相关问题