SwiftUI 列表未出现

SwiftUI List doesn't appear

早上好,

我的 SwiftUI 列表有问题。 在从我的 JSON 正确接收数据并将其作为字符串之后,信息似乎没有出现在我的列表视图中。

struct Lists: View{

@State private var Countries = [Country]()

var body: some View {
        List(Countries, id: \.id) { item in
            VStack(alignment: .leading) {
                Text(item.Country)
                    .font(.headline)
                Text(item.Country)
            }
        }.onAppear(perform: loadData)
    
}

func loadData() {
    guard let url = URL(string: "https://api.covid19api.com/summary") else {
        print("Invalid URL")
        return
    }
    let request = URLRequest(url: url)
    let jsonData = (try! String(contentsOf: url))
    /*print(jsonData)*/
    
    URLSession.shared.dataTask(with: request) { data, response, error in
        
        let decoder = JSONDecoder()
        decoder.dateDecodingStrategy = .iso8601
        
        if let jsonData = data {
            do {
                let decodedResponse = try decoder.decode(AllCountries.self, from: jsonData)
                print(decodedResponse.Countries)
                
            } catch let error as NSError {
            /*print("json error: \(error.localizedDescription)")*/
            print("json error: \(error)")
            
        }
    }
    }.resume()
}

这是我的对象结构:

struct AllCountries: Decodable {
    var Countries: [Country]
}

struct AllCountries: Decodable {
    var Countries: [Country] }
    struct Country: Decodable, Identifiable {
    let id = UUID()
    var Country, CountryCode, Slug: String
    var NewConfirmed, TotalConfirmed, NewDeaths, TotalDeaths: Int
    var NewRecovered, TotalRecovered: Int
    var Date: Date
    }

    enum CodingKeys: String, CodingKey {
        case Country = "Country"
        case CountryCode = "CountryCode"
        case Slug = "Slug"
        case NewConfirmed = "NewConfirmed"
        case TotalConfirmed = "TotalConfirmed"
        case NewDeaths = "NewDeaths"
        case TotalDeaths = "TotalDeaths"
        case NewRecovered = "NewRecovered"
        case TotalRecovered = "TotalRecovered"
        case Date = "Date"       
    }
}

这是我打印时“数据”结果的开头:

[_IOS_Project.Country(id: EB629D42-8278-444C-878E-A6EAC46BD5D6, Country: "Afghanistan", CountryCode: "AF", Slug: "afghanistan", NewConfirmed: 546, TotalConfirmed: 28424, NewDeaths: 21, TotalDeaths: 569, NewRecovered: 330, TotalRecovered: 8292, Date: 2020-06-21 19:37:01 +0000), _IOS_Project.Country(id: 8DDDCA84-CE99-4374-A487-096BFDF8A467, Country: "Albania", CountryCode: "AL", Slug: "albania", NewConfirmed: 53, TotalConfirmed: 1891, NewDeaths: 1, TotalDeaths: 43, NewRecovered: 12, TotalRecovered: 1126, Date: 2020-06-21 19:37:01 +0000),

有人能指出我在这个问题上的正确方向吗?

提前致谢:)

您的代码似乎有一些问题。

首先是变量的命名。 Swift 中的变量名称以小写字母开头,结构和 类 中的变量名称以大写字母开头。

其次,您没有将 URLRequest 的响应分配给国家/地区状态变量,这是主要问题。

第三,您粘贴的代码格式似乎不正确。

我将您的代码放入了一个新项目中,并通过一些调整使其正常工作。

struct ContentView: View {

    @State private var countries = [AllCountries.Country]()

    var body: some View {
        List(countries, id: \.id) { item in
            VStack(alignment: .leading) {
                Text(item.country)
                    .font(.headline)
                Text(item.country)
            }
        }.onAppear(perform: loadData)

    }

    func loadData() {
        guard let url = URL(string: "https://api.covid19api.com/summary") else {
            print("Invalid URL")
            return
        }
        let request = URLRequest(url: url)

        URLSession.shared.dataTask(with: request) { data, response, error in

            let decoder = JSONDecoder()
            decoder.dateDecodingStrategy = .iso8601

            if let jsonData = data {
                do {
                    let decodedResponse = try decoder.decode(AllCountries.self, from: jsonData)
                    print(decodedResponse.countries)
                    // You should update this on the main thread
                    DispatchQueue.main.async {
                        // this assigns the values you received to the state variable countries
                        self.countries = decodedResponse.countries
                    }

                } catch let error as NSError {
                    print("json error: \(error)")
                }
            }
        }.resume()
    }
}

请注意,在 loadData 函数中,我将 URLRequest 的响应分配给了 countries 变量。因为这是一个 @State 变量,它会导致屏幕在更改时重新加载。您没有这样做,所以您的 UI 不知道它需要更新。

我还更新了你的变量名,所以它们都是小写的。

struct AllCountries: Decodable {
    var countries: [Country]

    enum CodingKeys: String, CodingKey {
        case countries = "Countries"
    }

    struct Country: Decodable, Identifiable {
        let id = UUID()
        var country, countryCode, slug: String
        var newConfirmed, totalConfirmed, newDeaths, totalDeaths: Int
        var newRecovered, totalRecovered: Int
        var date: Date

        enum CodingKeys: String, CodingKey {
            case country = "Country"
            case countryCode = "CountryCode"
            case slug = "Slug"
            case newConfirmed = "NewConfirmed"
            case totalConfirmed = "TotalConfirmed"
            case newDeaths = "NewDeaths"
            case totalDeaths = "TotalDeaths"
            case newRecovered = "NewRecovered"
            case totalRecovered = "TotalRecovered"
            case date = "Date"
        }
    }
}