【问题标题】:How to pass a state variable to a second view after it has been incremented in the first view in a foreach loop如何在 foreach 循环的第一个视图中递增状态变量后将其传递给第二个视图
【发布时间】:2021-12-30 13:21:08
【问题描述】:

我对 SwiftUI 很陌生,所以请保持温和。我正在尝试将状态变量的值传递给视图,并且我希望状态变量在 ForEach 循环内递增。这是不起作用的代码。 Text 语句使用本地 val 变量可以正常工作,但状态 val 变量保持不变。任何解决此问题的帮助将不胜感激。类似问题的解决方案似乎并不适用。

struct ContentView: View {
    @State
    var val: Int = 25

    var body: some View {
        VStack {
            ForEach(Array(stride(from: 10, to: 100, by: 10)), id: \.self) { val in
                HStack {
                    Text("\(val)")
                    SubView(val: $val)
                }
            }
        }
    }
}

struct SubView: View {
    @Binding var val: Int

    var body: some View {
        Text("\(val)")
    }
}

【问题讨论】:

  • 这对你目前正在做的事情没有任何意义。你希望用你传入的Binding 做什么?你会用它做什么,这将如何影响ContentView?我看不到您将如何处理 @State 变量中的 val

标签: swift foreach swiftui view state


【解决方案1】:

我认为您在弄乱“ForEach”的语法,它是一个接受集合作为输入并提供完全自定义主体的构造,该主体是一个以序列元素作为参数的闭包。

所以当你打电话时:

ForEach(Array(stride(from: 10, to: 100, by: 10)), id: \.self) { val in

你指的不是你的:

@State var val: Int = 25

你只是在一个集合(Array(Stride))上循环,并用单词“val”临时引用每个元素,但你却使用了任何其他单词,例如:

ForEach(Array(stride(from: 10, to: 100, by: 10)), id: \.self) { increment in

在这个前提之后,很明显你的“val”在执行过程中永远不会改变,这两个文本都保持不变是正确的。

另外要理解的是,ForEach 只能用于 UI 操作,不能用于更改变量或执行代码。 所以我建议您使用如下替代方案:

struct ContentView: View {
    @State
    var val: Int = 25

    var body: some View {
        HStack {
            Text("\(val)")
            SubView(val: $val)
        }
        .onAppear {
            for i in stride(from: 10, to: 100, by: 10) {
                val = i
            }
        }
    }
}

但我不太明白你想要得到什么输出。

【讨论】:

  • 感谢您非常有帮助的回复。我的意图是使用 val 变量返回一个子视图,该子视图表示更大的值表中的一行,以构造一个结果表,但我仍然在 SwiftUI 中找到了自己的方法,但我做了一些错误的转折!
  • 我不认为 State 和 Binding 是您的解决方案。 State 它就像一个源,Binding 它就像一个动态副本,当您更改状态时,所有绑定都会自动更改为它的值。因此,例如,如果您创建一个有 100 行的表,并且每行包含与 val 的绑定,当 val 为 25 时,所有行都等于 25。如果增加 val,所有行都将更新为相同的值。
  • 感谢您的建议。我最终创建了一个函数,该函数返回一个视图,其内容由传递给在 foreach 循环中递增的函数的变量进行调整。不确定这是否是最好的方法,但它有效。
猜你喜欢
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多