SwiftUI - 如何根据列表为文本设置不同的值

SwiftUI - How to have different value for Text according to a List

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()
    }
}

例如,现在当我在列表中点击 "Potato" 时,视图中的文本将显示 "Potato"。 但我想为每一个列出的文本使用不同的文本,而不是同一个词。

我如何使用 SwiftUI 做到这一点?

谢谢。

您可以创建一个 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")]

并且您的视图会略有变化以使用 ingredient 对象中的 namedescription 字段

    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)
        }
    }

在下面的示例中,我使用了 MVVM 概念来分离视图及其逻辑。接下来,ViewModel 包含两个 arrays/dictionaries:

1。 disciplinesIds 拥有唯一的 ID 来标识学科
2. disciplines 保存要显示的项目,映射到 ids

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())
    }
}

在您的视图中,为了提高性能(请参阅此 article)遍历 ID 列表,而不是使用字典本身。您甚至可以将 discipline 对象传递给视图 DetailView.