AsyncImage 未渲染列表中的所有图像并产生错误代码 =-999“已取消”

Ton*_*ony 8 swiftui swiftui-list swiftui-asyncimage

我无法使用 AsyncImage 将所有图像显示在列表中。当您第一次运行该应用程序时,看起来不错,但如果您开始滚动,则不会显示某些图像。在该行滚动到屏幕之外并返回到视图之前,ProgressView 不会更新,或者我收到错误代码=-999“已取消”。

我可以使用常规图像视图来显示所有图像并正确更新 ProgressView,并完成下载和显示图像的整个设置过程。只有当我尝试使用 AsyncImage 时,所有图像都不会显示。如何让所有 AsyncImages 显示在列表中?

struct ContentView: View {
    
    @StateObject private var viewModel = ListViewModel()
    
    var body: some View {
        List {
            ForEach(viewModel.images) { photo in
                HStack {
                    AsyncImage(url: URL(string: photo.thumbnailUrl)) { phase in
                        switch phase {
                        case .success(let image):
                            image
                        case .failure(let error):
                            let _ = print(error)
                            Text("error: \(error.localizedDescription)")
                        case .empty:
                            ProgressView()
                        @unknown default:
                            fatalError()
                        }
                    }
                    
                    VStack(alignment: .leading) {
                        Text(photo.title)
                        Text(photo.thumbnailUrl)
                    }
                }
            }
        }
        .task {
            await viewModel.loadImages()
        }
    }
}

@MainActor 
class ListViewModel: ObservableObject {
    
    @Published var images: [PhotoObject] = []
    
    func loadImages() async {
        do {
            let photos = try await AsyncImageManager.downloadImages()
                images = photos
        } catch {
            print("Could load photos: \(error)")
        }
    }
    
}

struct AsyncImageManager {
    
    static func downloadImages() async throws -> [PhotoObject] {
        let url = URL(string: "https://jsonplaceholder.typicode.com/photos")!
        
        let (data, _) = try await URLSession.shared.data(from: url)
        return try JSONDecoder().decode([PhotoObject].self, from: data)
    }
}

struct PhotoObject: Identifiable, Codable {
    let albumId: Int
    let id: Int
    let title: String
    let url: String
    let thumbnailUrl: String
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在此输入图像描述

在此输入图像描述

Far*_*ouK 7

这仍然是 iOS 16 中的一个错误。我发现的唯一解决方案是使用 ScrollView + LazyVStack 而不是 List。

  • 我看到同样的问题。我尝试使用 ScrollView + LazyVStack 以及内部的 ForEach 代码,但它仍然无法正常工作。我仍然看到错误被取消而不是图像。 (2认同)