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
}
这仍然是 iOS 16 中的一个错误。我发现的唯一解决方案是使用 ScrollView + LazyVStack 而不是 List。
| 归档时间: | 
 | 
| 查看次数: | 3782 次 | 
| 最近记录: |