SwiftUI NavigationLink 不会显示动态数据

SwiftUI NavigationLink will not display dynamic data

我正在尝试创建一个推送到某个动态列表视图的导航链接,不幸的是,我推送到的视图没有显示相应的数据。

我的数据是从相当复杂的 JSON 中解析出来的,它在数组中包含数组。我是编码新手,我能想到访问嵌套数据的唯一方法是指定数组中的特定元素,但通过这样做,我基本上已经在我要推送的视图中创建了一个静态列表视图。

我真的很感激在正确的方向上轻推。我一直在拔头发。提前致谢。

struct MakeList: View {
    var body: some View {
        HStack {
            NavigationView{
                List(vehicleData.makes) { i in
                    HStack {
                        NavigationLink(destination: ModelList()){
                            Image(i.models[0].badges[0].logoName)
                                .resizable()
                                .aspectRatio(contentMode: .fit)
                                .frame(width: 50, height: 50)
                            Text(i.makesName)
                        }
                    }
                }.navigationTitle("Make")
            }
        }
    }
}
struct ModelList: View {
    var body: some View {
        List(vehicleData.makes[0].models) { i in
            Text(i.modelName)
            Text(i.badges[0].series ?? "no series")
        }.navigationTitle("Models")
    }
}

获取数据:

        func load<T: Decodable>(_ filename: String) -> T {
    let data: Data
    
    guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
    else {
        fatalError("Couldn't find \(filename) in main bundle.")
    }
    
    do {
        data = try Data(contentsOf: file)
    } catch {
        fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
    }
    
    do {
        let decoder = JSONDecoder()
        return try decoder.decode(T.self, from: data)
    } catch {
        fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
    }
}


var vehicleData: VehicleStruct = load("vehicleValuationData - nested version.json")

// MARK: - VehicleStruct
struct VehicleStruct: Codable, Identifiable {
    var id = UUID()
    let makes: [MakeStruct]
    
    enum CodingKeys: String, CodingKey {
        case makes
    }
}
// MARK: - Make
struct MakeStruct: Codable, Identifiable {
    var id = UUID()
    let makesName: String
    let models: [ModelStruct]
    
    enum CodingKeys: String, CodingKey {
        case makesName
        case models
    }
}
// MARK: - Model
struct ModelStruct: Codable, Identifiable {
    var id = UUID()
    let modelName: String
    let badges: [BadgeStruct]
    
    enum CodingKeys: String, CodingKey {
        case modelName
        case badges
    }
}
// MARK: - Badge
struct BadgeStruct: Codable, Identifiable {
    var id = UUID()
    let badgeName: String
    let series: String?
    let year: Int
    let fuel: String
    let driveType: String
    let bodyType: String
    let transmission: String
    let manualDeduction: Int
    let priceWhenNew: Int
    let depreciationForKms, algorithmValuation: Double
    let valuerValuation: Int
    let valo: Double
    let logoName: String
    
    enum CodingKeys: String, CodingKey {
        case badgeName
        case series
        case year
        case fuel
        case driveType
        case bodyType
        case transmission
        case manualDeduction
        case priceWhenNew
        case depreciationForKms
        case algorithmValuation
        case valuerValuation
        case valo
        case logoName
    }
}

JSON 例子

{
  "makes": [
    {
      "makesName": "Alfa Romeo",
      "models": [
        {
          "modelName": "147",
          "badges": [
            {
              "badgeName": "Twin Spark",
              "series": null,
              "year": 2004,
              "fuel": "Petrol",
              "driveType": "2WD",
              "bodyType": "Small Hatch",
              "transmission": "Automatic",
              "manualDeduction": -250,
              "subtraction1": null,
              "subtraction1Difference": 0,
              "add1": "Sunroof",
              "add1Difference": 250,
              "add2": null,
              "add2Difference": 0,
              "add3": null,
              "add3Difference": 0,
              "add4": null,
              "add4Differnece": 0,
              "avgAnnualKms": 15000,
              "age": 16,
              "averageKmsForYear": 240000,
              "priceWhenNew": 0,
              "depreciationForKms": 0,
              "algorithmValuation": 0,
              "valuerValuation": 500,
              "valo": 500,
              "logoName": "Alfa"
            }
          ]
        }...

只需将MakeStruct类型的相应对象传递给您的子视图ModelList:

NavigationLink(destination: ModelList(make: i)){
    Image(i.models[0].badges[0].logoName)
        .resizable()
        .aspectRatio(contentMode: .fit)
        .frame(width: 50, height: 50)
    Text(i.makesName)
}

struct ModelList: View {
    let make: MakeStruct

    var body: some View {
        List(self.make.models) { i in
            Text(i.modelName)
            Text(i.badges[0].series ?? "no series")
        }.navigationTitle("Models")
    }
}