Интересно, если кто-нибудь может помочь, я новичок в swiftUI, и я учился в течение последних нескольких недель. У меня возникла проблема с загрузкой изображений из URL и их отображением. После успешного выяснения этого я либо столкнулся с ошибкой, либо я делаю что-то действительно неправильно. Если я перечисляю изображения в foreach l oop и строю его, появляется только половина изображений, и если я использую только Список, все они выглядят хорошо, что не имеет смысла для меня. Если затем я добавлю рамку к изображению, а затем установлю их, скажем, 70 х 70, они все отобразятся.
class ImageLoader: ObservableObject {
var didChange = PassthroughSubject<Data, Never>()
var data = Data() {
didSet {
didChange.send(data)
}
}
init(imageUrl:String) {
guard let url = URL(string: imageUrl) else { return }
let task = URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data else { return }
DispatchQueue.main.async {
self.data = data
}
}
task.resume()
}
}
struct ImageViewWidget: View {
@ObservedObject var imageLoader:ImageLoader
@State var image:UIImage = UIImage()
init(imageUrl:String) {
imageLoader = ImageLoader(imageUrl:imageUrl)
}
var body: some View {
Image(uiImage: image).resizable()
.onReceive(imageLoader.didChange) { data in
self.image = UIImage(data: data) ?? UIImage()
}
}
}
Фрагмент Above - это то, что извлекает мое изображение из URL
ForEach(
networkManager.post,id:\.id){ post in
AboutRowView(post:post)
}
Тогда цикл по возвращенным изображениям и вызов моей собственной строки выше не работает, а ниже показывает все изображения, но я не понимаю, почему
List(
networkManager.post,id:\.id){ post in
AboutRowView(post:post)
}
О строке Посмотрите, чтобы вы могли видеть, что называется
struct AboutRowView: View {
let post : Posts
var body: some View {
VStack(alignment: .leading, spacing: 8){
ImageViewWidget(imageUrl: post.featured_image)
.scaledToFill()
.frame(height:150)
.clipped()
Text(post.title.rendered).lineLimit(nil).padding(.leading,16)
HStack{
ImageViewWidget(imageUrl: post.featured_image).frame(width:70, height:70)
.clipped()
.clipShape(Circle())
VStack(alignment: .leading, spacing: 4){
Text("Test Name").font(.headline)
Text("Posted 8 Hours Ago").font(.subheadline)
}.padding(.leading, 8)
}.padding(.leading, 16).padding(.top, 16)
}.padding(.leading, -18)
}
}