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