Изображения со списком и Foreach в SwiftUI - PullRequest
2 голосов
/ 05 марта 2020

Интересно, если кто-нибудь может помочь, я новичок в 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)

    }
}
...