我写了一个异步图像视图 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
我想这是因为List
创建和更新UICollectionViewCell
s 并重用它们。因此,当您滚动时,单元格不会消失,而是会重新出现,只是在屏幕上移动。由于任务在视图出现时运行,所以它不会发生,因为单元格已经出现并且刚刚被移动。显然 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(使用前将#替换为@)