如何从 ForEach 列表中的项目访问值
How to access value from an item in ForEach list
如何访问用 ForEach 制作的列表中特定项目的值?
如您所见,我正在尝试这样的事情(以及许多其他选项):
文本(项目[2].onOff ? "On" : "Off")
我想检查第二个列表项的切换值(例如)并更新屏幕上的文本说明它是打开还是关闭。
而且我知道这与 @Binding 有关,我正在搜索这方面的示例并尝试了一些东西,但我无法让它工作。也许这是一个初学者的问题。如果有人能帮助我,我将不胜感激。
我的内容视图:
struct ContentView: View {
// @Binding var onOff : Bool
@State private var onOff = false
@State private var test = false
var body: some View {
NavigationView {
List {
HStack {
Text("Is 2nd item on or off? ")
Text(onOff ? "On" : "Off")
// Text(item[2].onOff ? "On" : "Off")
}
ForEach((1...15), id: \.self) {item in
ListItemView()
}
}
.navigationBarTitle(Text("List"))
}
}
}
和 ListItemView:
import SwiftUI
struct ListItemView: View {
@State private var onOff : Bool = false
// @Binding var onOff : Bool
var body: some View {
HStack {
Text("99")
.font(.title)
Text("List item")
Spacer()
Toggle(isOn: self.$onOff) {
Text("Label")
}
.labelsHidden()
}
}
}
我不知道你到底想实现什么,但我给你做了一个工作示例:
struct ListItemView: View {
@ObservedObject var model: ListItemModel
var body: some View {
HStack {
Text("99")
.font(.title)
Text("List item")
Spacer()
Toggle(isOn: self.$model.switchedOnOff) {
Text("Label")
}
.labelsHidden()
}
}
}
class ListItemModel: ObservableObject {
@Published var switchedOnOff: Bool = false
}
struct ContentView: View {
@State private var onOff = false
@State private var test = false
@State private var list = [
(id: 0, model: ListItemModel()),
(id: 1, model: ListItemModel()),
(id: 2, model: ListItemModel()),
(id: 3, model: ListItemModel()),
(id: 4, model: ListItemModel())
]
var body: some View {
NavigationView {
List {
HStack {
Text("Is 2nd item on or off? ")
Text(onOff ? "On" : "Off")
// Text(item[2].onOff ? "On" : "Off")
}
ForEach(self.list, id: \.id) {item in
ListItemView(model: item.model)
}
}
.navigationBarTitle(Text("List"))
}.onReceive(self.list[1].model.$switchedOnOff, perform: { switchedOnOff_second_item in
self.onOff = switchedOnOff_second_item
})
}
}
@Published
基本上创建了一个 Publisher
,UI 可以根据 onReceive()
.
收听
尝试一下,您就会明白这些东西的作用!
祝你好运:)
我明白你是在指导我使用 ObservableObject。这可能是处理最终产品的最佳方式。但我仍在考虑 @Binding,因为我只需要在 2 个视图之间更好地传递值。可能我还是不懂绑定,但是我来到了这个解决方案。
struct ContentView: View {
// @Binding var onOff : Bool
@State private var onOff = false
// @State private var test = false
var body: some View {
NavigationView {
List {
HStack {
Text("Is 2nd item on or off? ")
Text(onOff ? "On" : "Off")
// Text(self.item[2].$onOff ? "On" : "Off")
// Text(item[2].onOff ? "On" : "Off")
}
ForEach((1...15), id: \.self) {item in
ListItemView(onOff: self.$onOff)
}
}
.navigationBarTitle(Text("List"))
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
和 ListItemView:
import SwiftUI
struct ListItemView: View {
// @State private var onOff : Bool = false
@Binding var onOff : Bool
var body: some View {
HStack {
Text("99")
.font(.title)
Text("List item")
Spacer()
Toggle(isOn: self.$onOff) {
Text("Label")
}
.labelsHidden()
}
}
}
现在发生的事情是在我点击切换后更新文本。但是我有两个问题:
点击 1 次切换会更改所有这些。我认为这是因为这一行:
ListItemView(onOff: self.$onOff)
我仍然无法访问一行的值。在我的理解中 ForEach((1...15), id: .self) 使每一行都有自己的 id,但我不知道以后如何访问它。
import SwiftUI
struct ContentView: View {
@State private var onOffList = Array(repeating: true, count: 15)
var body: some View {
NavigationView {
List {
HStack {
Text("Is 2nd item on or off? ")
Text(onOffList[1] ? "On" : "Off")
}
ForEach((onOffList.indices), id: \.self) {idx in
ListItemView(onOff: self.$onOffList[idx])
}
}
.navigationBarTitle(Text("List"))
}
}
}
struct ListItemView: View {
@Binding var onOff : Bool
var body: some View {
HStack {
Text("99")
.font(.title)
Text("List item")
Spacer()
Toggle(isOn: $onOff) {
Text("Label")
}
.labelsHidden()
}
}
}
如何访问用 ForEach 制作的列表中特定项目的值? 如您所见,我正在尝试这样的事情(以及许多其他选项):
文本(项目[2].onOff ? "On" : "Off")
我想检查第二个列表项的切换值(例如)并更新屏幕上的文本说明它是打开还是关闭。
而且我知道这与 @Binding 有关,我正在搜索这方面的示例并尝试了一些东西,但我无法让它工作。也许这是一个初学者的问题。如果有人能帮助我,我将不胜感激。
我的内容视图:
struct ContentView: View {
// @Binding var onOff : Bool
@State private var onOff = false
@State private var test = false
var body: some View {
NavigationView {
List {
HStack {
Text("Is 2nd item on or off? ")
Text(onOff ? "On" : "Off")
// Text(item[2].onOff ? "On" : "Off")
}
ForEach((1...15), id: \.self) {item in
ListItemView()
}
}
.navigationBarTitle(Text("List"))
}
}
}
和 ListItemView:
import SwiftUI
struct ListItemView: View {
@State private var onOff : Bool = false
// @Binding var onOff : Bool
var body: some View {
HStack {
Text("99")
.font(.title)
Text("List item")
Spacer()
Toggle(isOn: self.$onOff) {
Text("Label")
}
.labelsHidden()
}
}
}
我不知道你到底想实现什么,但我给你做了一个工作示例:
struct ListItemView: View {
@ObservedObject var model: ListItemModel
var body: some View {
HStack {
Text("99")
.font(.title)
Text("List item")
Spacer()
Toggle(isOn: self.$model.switchedOnOff) {
Text("Label")
}
.labelsHidden()
}
}
}
class ListItemModel: ObservableObject {
@Published var switchedOnOff: Bool = false
}
struct ContentView: View {
@State private var onOff = false
@State private var test = false
@State private var list = [
(id: 0, model: ListItemModel()),
(id: 1, model: ListItemModel()),
(id: 2, model: ListItemModel()),
(id: 3, model: ListItemModel()),
(id: 4, model: ListItemModel())
]
var body: some View {
NavigationView {
List {
HStack {
Text("Is 2nd item on or off? ")
Text(onOff ? "On" : "Off")
// Text(item[2].onOff ? "On" : "Off")
}
ForEach(self.list, id: \.id) {item in
ListItemView(model: item.model)
}
}
.navigationBarTitle(Text("List"))
}.onReceive(self.list[1].model.$switchedOnOff, perform: { switchedOnOff_second_item in
self.onOff = switchedOnOff_second_item
})
}
}
@Published
基本上创建了一个 Publisher
,UI 可以根据 onReceive()
.
尝试一下,您就会明白这些东西的作用!
祝你好运:)
我明白你是在指导我使用 ObservableObject。这可能是处理最终产品的最佳方式。但我仍在考虑 @Binding,因为我只需要在 2 个视图之间更好地传递值。可能我还是不懂绑定,但是我来到了这个解决方案。
struct ContentView: View {
// @Binding var onOff : Bool
@State private var onOff = false
// @State private var test = false
var body: some View {
NavigationView {
List {
HStack {
Text("Is 2nd item on or off? ")
Text(onOff ? "On" : "Off")
// Text(self.item[2].$onOff ? "On" : "Off")
// Text(item[2].onOff ? "On" : "Off")
}
ForEach((1...15), id: \.self) {item in
ListItemView(onOff: self.$onOff)
}
}
.navigationBarTitle(Text("List"))
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
和 ListItemView:
import SwiftUI
struct ListItemView: View {
// @State private var onOff : Bool = false
@Binding var onOff : Bool
var body: some View {
HStack {
Text("99")
.font(.title)
Text("List item")
Spacer()
Toggle(isOn: self.$onOff) {
Text("Label")
}
.labelsHidden()
}
}
}
现在发生的事情是在我点击切换后更新文本。但是我有两个问题:
点击 1 次切换会更改所有这些。我认为这是因为这一行:
ListItemView(onOff: self.$onOff)
我仍然无法访问一行的值。在我的理解中 ForEach((1...15), id: .self) 使每一行都有自己的 id,但我不知道以后如何访问它。
import SwiftUI
struct ContentView: View {
@State private var onOffList = Array(repeating: true, count: 15)
var body: some View {
NavigationView {
List {
HStack {
Text("Is 2nd item on or off? ")
Text(onOffList[1] ? "On" : "Off")
}
ForEach((onOffList.indices), id: \.self) {idx in
ListItemView(onOff: self.$onOffList[idx])
}
}
.navigationBarTitle(Text("List"))
}
}
}
struct ListItemView: View {
@Binding var onOff : Bool
var body: some View {
HStack {
Text("99")
.font(.title)
Text("List item")
Spacer()
Toggle(isOn: $onOff) {
Text("Label")
}
.labelsHidden()
}
}
}