Как передать последовательные данные в navigationBarTitle в SwiftUI - PullRequest
0 голосов
/ 31 октября 2019

У меня есть приложение 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

Любая помощь очень ценится.

1 Ответ

1 голос
/ 01 ноября 2019

Вы можете передать пользователя на CityList так же, как вы пропустили список городов.

В сообщении об ошибке сообщается, что вам не хватает одного из параметров для инициализатора для каждого элемента, который автоматически получает CityList. Поэлементный инициализатор принимает все свойства структуры и, я полагаю, в том порядке, в котором они объявлены в структуре.

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