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
对象中的 name
和 description
字段
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
.
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
对象中的 name
和 description
字段
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
.