SwiftUI - Как получить другое значение для текста в соответствии со списком - PullRequest
1 голос
/ 26 февраля 2020
import SwiftUI

struct ContentView: View {

  let disciplines = ["Potato", "Tomato", "Onion"]

  var body: some View {
        NavigationView{
            List(disciplines, id: \.self) { discipline in
                NavigationLink(
                    destination: DetailView(discipline: discipline)) {
                        Text(discipline)
                    }
            }
            .navigationBarTitle (Text("The App Title"), displayMode: .inline)
        }
    }
}



struct DetailView: View {
  let discipline: String
  var body: some View {
    Text(discipline)
  }
}


struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Прямо сейчас, например, когда я нажимаю «Картошка» в списке, текст в представлении будет отображать «Картошка». Но я хочу иметь различный текст для каждого из перечисленных, а не одно и то же слово.

Как я могу сделать это с SwiftUI?

Спасибо.

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Вы можете создать объект ingredient и иметь два поля. Один для name и один для description

struct Ingredient: Identifiable {
    var id = UUID()
    var name: String
    var description: String
}

. При этом вам придется изменить disciplines на следующие, чтобы принимать ingredient объекты, а не строки

    let disciplines = [Ingredient(name: "Potato", description: "Yummy potato"),
                       Ingredient(name: "Tomato", description: "Yummy Tomato"),
                       Ingredient(name: "Onion", description: "Yummy Onion")]

и ваше представление будет слегка изменено для использования полей name и description из объекта ingredient

    var body: some View {
        NavigationView{
            List(disciplines) { discipline in
                NavigationLink(
                destination: DetailView(discipline: discipline.description)) {
                    Text(discipline.name)
                }
            }
            .navigationBarTitle (Text("The App Title"), displayMode: .inline)
        }
    }
0 голосов
/ 27 февраля 2020

В моем примере ниже я использовал концепцию MVVM , чтобы отделить представление и его логику c. Далее ViewModel содержит два массива / словари:

1. disciplinesIds содержит уникальные идентификаторы для определения дисциплин
2. disciplines содержит элементы, которые нужно отобразить, сопоставленные с идентификаторами

import SwiftUI

struct discipline {
    let name: String
    let content: String
}

final class ContentViewModel: ObservableObject {
    @Published var disciplinesIds: [UUID] = []
    @Published var disciplines: [UUID : discipline] = [:]

    init() {
        for item: String in ["Potato", "Tomato", "Onion"] {
            let id = UUID()

            self.disciplinesIds.append(id)
            self.disciplines[id] = discipline(name: item, content: item + "_content")
        }
    }
}


struct ContentView: View {
    @ObservedObject var viewModel: ContentViewModel

    var body: some View {
        NavigationView{
            List(self.viewModel.disciplinesIds, id: \.self) { discipline in
                NavigationLink(destination: DetailView(discipline: self.viewModel.disciplines[discipline]!.content)) {
                    Text(self.viewModel.disciplines[discipline]!.name)
                }
            }
            .navigationBarTitle (Text("The App Title"), displayMode: .inline)
        }
    }
}

struct DetailView: View {
    let discipline: String

    var body: some View {
        Text(discipline)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(viewModel: .init())
    }
}

В вашем представлении итеративно просматривайте список идентификаторов для повышения производительности (см. Эту статью ) вместо используя сам словарь. Вы даже можете передать объект discipline в представление DetailView.

...