首页 > 解决方案 > 无法在swiftUI中显示来自url的图像

问题描述

我是 swiftUI 新手并尝试创建简单的应用程序来显示来自图像 API 的图像我从 url 获取图像但无法在 Imageview 中显示它,我有按钮,当我按下它时,它调用 api 并返回单个图片网址,我不知道问题出在哪里

import SwiftUI

struct ContentView: View {
    @ObservedObject var NetworkManager = Network()
    var body: some View {
        
        ZStack{
            VStack{
                ImageDog(UIDogImage:self.NetworkManager.Dog ?? UIImage(systemName: "photo")!)
            

            Button(action: {
              
                self.NetworkManager.ApiCaller()

                
            }) {
                Text("GET DOG").font(.system(size: 20)).foregroundColor(Color(#colorLiteral(red: 0.5272222161, green: 0.6115953326, blue: 0.6786056161, alpha: 1))).padding()
                }.background(Color(#colorLiteral(red: 0.5401973128, green: 0.9296894073, blue: 0.6209766269, alpha: 1))).cornerRadius(20)
            }
                
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

struct ImageDog: View {
   @State var UIDogImage:UIImage
    var body: some View {
        Image(uiImage:UIDogImage).resizable().frame(width: 200, height: 200, alignment: .center).padding()
     
    }
}

和图像 url 返回的网络调用者,我将其更改为图像,然后将其传递给 Dog 属性图像

import SwiftUI
class Network:ObservableObject {
    @Published var Dog:UIImage?
    //  This Api return random dog images every time you request it
    // https://dog.ceo/api/breeds/image/random
    
    
     // MARK: Network Caller
    func ApiCaller(){ // used URLSession for Network requesting and Codable For parsing JSON
       
    
        // 1 :: create URL
        if let DogURL = URL(string: "https://dog.ceo/api/breeds/image/random") {
        
        // 2 :: create URLSession
            let session = URLSession(configuration: .default)
        
        // 3 :: give Sesion Task
            let Dogtask = session.dataTask(with: DogURL) { (data, response, error) in
                if error == nil {
                    if let DogData = data {
                    do {
                        let DogResponseResult = try JSONDecoder().decode(DogResponse.self, from: DogData)
                        print(DogResponseResult.message!)
                        if let data = try? Data(contentsOf: URL(string: DogResponseResult.message!)!){
                            DispatchQueue.main.async {
                                self.Dog = UIImage(data: data)
                            }
                        }                    
                        
                    }catch{
                        print(error)
                    }
                    }
            }
            }
        
        // 4 :: Start Session Task
            Dogtask.resume() // Send the request here
        }
        
    }
  
}

标签: iosswiftswiftui

解决方案


推荐阅读