我已经写了一个带有swiftuiAsyncImgView,并在列表单元格中使用.

AsyncImgView使用任务修饰符从缓存或网络下载IMG时,在iOS16之前一切正常,但在iOS16我发现,而I scroll the list的新单元的AsyncImgView doesn't call task modifier,所以新的AsyncImageView不会下载IMG,除非再次touch 它.我发现其他一些与用户界面无关的修饰符也存在同样的问题.

我试过在主体中调用下载函数,而不是在任务修饰符中使用,它很管用,但我认为这不是一个好主意.

有谁知道吗?

Demo code:

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

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创建和更新了UICollectionViewCell,并重复使用了它们.因此,当你滚动时,单元格并没有消失,它只是在屏幕上移动而已.因为任务在视图出现时运行,所以它不会发生,因为单元格已经出现并且刚刚被移动.显然,SwiftUI在这里进行了一些优化,但您可以使用.equatableEquatable来覆盖它,例如

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之前使用的列表为UITableViewCell

Ios相关问答推荐

iPhone:iOS 17.4中没有气压数据

SWIFT设备方向更新不正确

底部导航栏在iOS上浮动

将数据传回VC时委托为空

Flutter应用内购买无法恢复购买

使用按位|带有布尔操作数

在 Swift 中 @MainActor 似乎被 withCheckedContinuation 而不是其他异步调用继承是巧合吗?

UIControl 子类 - 按下时显示 UIMenu

XCode 14 Beta 中 NavigationStack 的正文渲染问题

SignalR 永远不会在 iOS 上使用 Xamarin Forms 启动

使用 RxDatasources 作为数据源时如何填充自定义页眉/页脚视图

实现一个将块用作回调的方法

iOS:应用程序在安装应用程序时未征求用户许可.每次都获得 kCLAuthorizationStatusNotDetermined - Objective-c & Swift

如何从一个特定的视图控制器中隐藏导航栏

以编程方式创建按钮并设置背景图像

Swift 将 unix 时间转换为日期和时间

Storyboard Segue 从视图控制器到自身

iPhone:什么是 WWDR 中级证书?

UIView 中的 safeAreaInsets 在 iPhone X 上为 0

NSURL 到带有 XCTest 的测试包中的文件路径