如何在SwiftUI中将顺序数据传递到NavigationBarTitle

时间:2019-10-31 17:48:27

标签: swiftui navigationbar master-detail dataflow

我有一个主从应用程序,从用户列表->他们的城市->他们的城镇开始。视图的内容工作正常,但是我无法弄清楚如何调整数据流,以使.navigationBarTitle反映以前选择的项目。例如如果我选择用户“吉米”,我希望“吉米”成为城市列表中的标题。

这是我的数据模型:

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

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以将用户传递到CityList,就像传递城市列表一样。

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

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