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")
}
}
我正在尝试创建一个推送到某个动态列表视图的导航链接,不幸的是,我推送到的视图没有显示相应的数据。
我的数据是从相当复杂的 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")
}
}