article

Monday, September 6, 2021

SwiftUI JSON Parsing with SDWebImageSwiftUI and Details View

SwiftUI JSON Parsing with SDWebImageSwiftUI and Details View

JSON Data
https://api.github.com/users/hadley/orgs

SDWebImageSwiftUI
https://github.com/SDWebimage/SDWebimageSwiftUI


ContentView.swift
 
//
//  ContentView.swift
//  swiftuidev
//
//  Created by Cairocoders
//

import SwiftUI
import SDWebImageSwiftUI

struct ContentView: View {
    
    @ObservedObject var getData = datas()
    
    var body: some View {
        NavigationView {
            List(getData.jsonData) { i in
                NavigationLink(destination : Details(userItem: i)) {
                    ListRow(url: i.avatar_url, name: i.login)
                }
            }.navigationBarTitle("Json Parsing")
        }
    }
}

class datas: ObservableObject {
  @Published var jsonData = [datatype]()
      
    init() {
        let url = URL(string: "https://api.github.com/users/hadley/orgs")!
        URLSession.shared.dataTask(with: url) {(data, response, error) in
            do {
                if let jsData = data {
                    let decodedData = try JSONDecoder().decode([datatype].self, from: jsData)
                    DispatchQueue.main.async {
                        self.jsonData = decodedData
                    }
                } else {
                    print("No data")
                }
            } catch {
                print("Error")
            }
        }.resume()
    }
}

struct datatype : Identifiable, Decodable {
    var id : Int
    var login : String
    var node_id : String
    var avatar_url : String
}

struct ListRow : View {
    
    var url : String
    var name : String
    
    var body: some View {
        HStack {
            AnimatedImage(url: URL(string: url)).resizable().frame(width: 60, height: 60).clipShape(Circle()).shadow(radius: 20)
            
            Text(name).fontWeight(.heavy).padding(.leading, 10)
        }
    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
Details.swift
 
//
//  Details.swift
//  swiftuidev
//
//  Created by Cairocoders
//

import SwiftUI
import SDWebImageSwiftUI

struct Details: View {
    
    let userItem : datatype
    
    var body: some View {
        VStack {
            Text("Username : \(userItem.login)")
                .font(.title2)
            
            let url = userItem.avatar_url
            
            AnimatedImage(url: URL(string: url)).resizable().frame(width: 160, height: 160).clipShape(Circle()).shadow(radius: 20)
        }
    }
}

Related Post