来自数据模型的NavigationList ForEach循环

问题描述 投票:0回答:1

我在循环访问导航列表中的 API 调用解码的 JSON 数据时遇到问题。我已成功将数据放入变量中,但似乎无法弄清楚如何在导航视图中循环数据和列表。我收到的错误是:“通用结构‘ForEach’要求‘CompetitionGroup’符合‘RandomAccessCollection’”

struct ContentView: View {
    let compse = competitionslist
    
    var body: some View {
        NavigationView {
            List {
                //ERROR ForEach(compse!) { competition in
                    NavigationLink(destination: Text(competition.genericname)) {
                        Image(systemName: "airplane")
                        Text(competition.genericname)
                    }.padding()
                }
                .navigationTitle("Destinations")
            }
        }
    }
}

数据解码如下:

func  getComps() -> CompetitionGroup? {
    let headers = [
        "x-rapidapi-key": "apices",
        "x-rapidapi-host": "api.webnsite"
    ]

    let request = NSMutableURLRequest(url: NSURL(string: "https://football-web-pages1.p.rapidapi.com/competitions.json?include=rounds")! as URL,
                                            cachePolicy: .useProtocolCachePolicy,
                                        timeoutInterval: 10.0)
    request.httpMethod = "GET"
    request.allHTTPHeaderFields = headers

    let session = URLSession.shared
    let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
        if (error != nil) {
            print(error as Any)
        } else {
            let httpResponse = response as? HTTPURLResponse
            
            do {
                let decoder = JSONDecoder()
                let comps = try decoder.decode(CompetitionGroup.self, from: data!)
                self.competitions = comps
            }
            catch {
                print("Error in JSON")
            }
        }
    })

    dataTask.resume()
    return competitions
}

CompetitionGroup模型保存了Competitions模型的列表,两个模型的结构如下所示。任何帮助将不胜感激。

public struct CompetitionGroup: Codable {
   var competitions:[Competition]?
}

public struct Competition: Codable {
var id: Int?
var type: String?
var genericname: String?
var fullname: String?

enum CodingKeys: String, CodingKey {
        case genericname = "generic-name"
        case fullname = "full-name"
    }
}
ios swiftui foreach
1个回答
1
投票

您需要先解开这些值

var body: some View {
    NavigationView {
        let competitions = compse?.competitions ?? []
        List {
            ForEach(competitions, id: \.id) { competition in
                NavigationLink(destination: Text(competition.genericname ?? "")) {
                    Image(systemName: "airplane")
                    Text(competition.genericname ?? "")
                }.padding()
            }
            .navigationTitle("Destinations")
        }
    }
}

请注意,NavigationView 已弃用,应替换为 NavigationStack

© www.soinside.com 2019 - 2024. All rights reserved.