如何将顺序数据传递到 SwiftUI 中的 navigationBarTitle

How to pass sequential data into a navigationBarTitle in SwiftUI

我有一个 master-detail 应用程序,它以用户列表开头 -> 他们的城市 -> 他们的城镇。视图的内容工作正常,但我不知道如何调整我的数据流,以便 .navigationBarTitle 反映先前选择的项目。例如如果我选择用户 "jimmy",我希望 "jimmy" 成为城市列表的标题。

这是我的数据模型:

import SwiftUI

struct UserModel: Codable, Identifiable {
    let id: Int
    let firstName: String
    let lastName: String
    let cities: [CityModel]

    enum CodingKeys: String, CodingKey {
        case id
        case firstName = "first_name"
        case lastName = "last_name"
        case cities
    }
}

struct CityModel: Codable, Identifiable {
    let id: Int
    let name: String
    let towns: [TownModel]
}

struct TownModel: Codable, Identifiable {
    let id: Int
    let name: String
}

这是我的根视图,UserList.swift:

import SwiftUI

struct UserList: View {
    var body: some View {
        NavigationView {
            List(userData) { user in
                NavigationLink(destination: CityList(cities: user.cities)) {
                    UserRow(user: user)
                }

            }
            .navigationBarTitle(Text("Users"))
        }
    }
}

struct UserList_Previews: PreviewProvider {
    static var previews: some View {
        UserList()
    }
}

这里是 CityList.swift 点击用户打开:

import SwiftUI

struct CityList: View {
    var thisUser: UserModel
    var cities: [CityModel]

    var body: some View {
        List (cities) { city in
            NavigationLink(destination: TownList(towns: city.towns)) {
               CityRow(city: city)

            }.navigationBarTitle(Text(self.thisUser.firstName))
        }
    }
}

错误在 UserList.swift 的下一行抛出,因为它调用了 CityList 但没有考虑到 CityList 对 "thisUser" 的引用。只是我不确定调整它的正确语法是什么。

NavigationLink(destination: CityList(cities: user.cities)) { UserRow(user: user) }

ERROR: Missing argument for parameter 'thisUser' in call

非常感谢任何帮助。

您可以像传递城市列表一样将用户传递给 CityList

错误消息告诉您缺少 CityList 自动接收的成员初始化程序的参数之一。成员初始化器采用结构的所有属性,我相信,按照它们在结构中声明的顺序。

NavigationLink(destination: CityList(thisUser: user, cities: user.cities)) { UserRow(user: user) }