swiftui - 在 URL 的列表中显示图像
问题描述
我有一个从 JSON API 填充的列表。
ForEach(booksVM.books.sorted { $0.popularidad > $1.popularidad}) { book in
HStack {
Image(URL: book.imagen)
Text(book.nombre)
Spacer()
}
Text(book.autor)
Spacer()
}
第三行是错误的,但这是我想要实现的。
现在,book.imagen
是 JSON 的所有图像 url 的 Decodable 变量。我怎样才能做到这一点?
JSON以防万一:
[
{
"id": 1,
"nombre": "The design of every day things",
"autor": "Don Norman",
"disponibilidad": true,
"popularidad": 70,
"imagen": "https://images-na.ssl-images-amazon.com/images/I/410RTQezHYL._SX326_BO1,204,203,200_.jpg"
},
{
"id": 2,
"nombre": "100 años de soledad",
"autor": "Garcia Marquez",
"disponibilidad": false,
"popularidad": 43,
"imagen": "https://images-na.ssl-images-amazon.com/images/I/51egIZUl88L._SX336_BO1,204,203,200_.jpg"
}
]
和结构:
struct Book: Identifiable, Decodable {
let id: Int
let nombre: String
let autor: String
let disponibilidad: Bool
let popularidad: Int
let imagen: String
}
解决方案
在这里,我找到了一个决定并为您修改了它。这个想法是用类ImageLoader创建ImageView:
struct ImageView: View {
@ObservedObject var imageLoader:ImageLoader
@State var image:UIImage = UIImage()
func imageFromData(_ data:Data) -> UIImage {
UIImage(data: data) ?? UIImage()
}
init(withURL url:String) {
imageLoader = ImageLoader(urlString:url)
}
var body: some View {
VStack {
Image(uiImage: imageLoader.data != nil ? UIImage(data:imageLoader.data!)! : UIImage())
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width:100, height:100)
}
}
}
class ImageLoader: ObservableObject {
@Published var dataIsValid = false
var data:Data?
init(urlString:String) {
guard let url = URL(string: urlString) else { return }
let task = URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data else { return }
DispatchQueue.main.async {
self.dataIsValid = true
self.data = data
}
}
task.resume()
}
}
现在您可以将其用于您的列表:
struct ListView: View {
let urls = ["https://images-na.ssl-images-amazon.com/images/I/410RTQezHYL._SX326_BO1,204,203,200_.jpg", "https://images-na.ssl-images-amazon.com/images/I/51egIZUl88L._SX336_BO1,204,203,200_.jpg"]
var body: some View {
List {
ForEach(urls, id: \.self) { url in
ImageView(withURL: url)
}
}
}
}
推荐阅读
- ag-grid - 如果仅知道该特定行中的唯一数据,如何专注于 agGrid(angular) 中的特定行?
- r - R Studio 中的“索引匹配”(多列)
- unit-testing - 我应该在单元测试中模拟每个依赖项吗?
- c# - 通过 IIS 部署时 ASP.NET Core 应用程序未记录到文件
- loops - 如何使用 windows CMD 或 Batch 在所有子文件夹中递归运行多个命令?
- vb.net - Windows 10 上的 vb.net 程序要慢得多
- python - 查找名称包含固定列中特定值的列
- python - Python - 使用多线程解析和重复代理
- r - R中tbl_spark中的多种日期格式。我想将所有日期格式更改为一种格式(dd-mm-yyyy)
- react-native - 如何在本机反应中有效地显示大量图像,例如 instagram 提要屏幕?