滚动 swiftUI 列表时,未调用单元格的任务修改器。怎么修?

2024-05-03

我写了一个异步图像视图 with swiftui,并在列表单元格中使用。

AsyncImgView 使用任务修饰符在 Img 出现时从缓存或网络下载 Img,在 iOS16 之前一切正常,但在iOS16我发现当我滚动列表新细胞的AsyncImgView 不调用任务修饰符,因此新的 AsyncImageView 不会下载 Img,除非再次触摸它。我发现其他一些与 UI 无关的修改器也有同样的问题。

我曾尝试在 body 中调用 download func 而不是在任务修饰符中使用,它有效,但我认为这不是一个好主意。

有人有什么想法吗?

演示代码:

滚动列表时,无法打印任务修改器中的所有单元格名称

struct TaskDemo: View {
    var models: [TaskModel] = {
        var m = [TaskModel]()
        for idx in 0...99 {
            m.append(TaskModel(id: idx))
        }
        return m
    }()
    var body: some View {
        List(models){model in
            TaskCell(name: model.name)
                .frame(height: 100)
        }
    }
}

struct TaskModel: Identifiable {
    var id: Int
    var name: String { String(id) }
}

struct TaskCell: View {
    @State var name: String
    var body: some View{
            Text(name)
            .task {
                print("task default modifier \(Thread.current) \(name)")
            }
    }
}

the pic can show that I scroll to 31 cell but only print the first 17 cells' name enter image description here


我想这是因为List创建和更新UICollectionViewCells 并重用它们。因此,当您滚动时,单元格不会消失,而是会重新出现,只是在屏幕上移动。由于任务在视图出现时运行,所以它不会发生,因为单元格已经出现并且刚刚被移动。显然 SwiftUI 在这里做了一些优化,但是您可以使用以下方法覆盖它.equatable and Equatable, e.g.

struct TaskModel: Identifiable {
    let id: Int
    var name: String { String(id) }
}

struct TaskDemo: View {
    let models = (0...99).map { TaskModel(id: $0) }

    var body: some View {
        List(models) { model in
            TaskCell(name: model.name)
                .equatable()
                .frame(height: 100)
        }
    }
}

struct TaskCell: View, Equatable {
    let name: String

    var body: some View{
            Text(name)
            .task {
                print("task default modifier \(Thread.current) \(name)")
            }
    }
}

注意:iOS 16之前使用的ListUITableViewCell

注意2:我相信当使用包含相同单元格的部分时,此解决方法不起作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

滚动 swiftUI 列表时,未调用单元格的任务修改器。怎么修? 的相关文章

随机推荐