如何在我的视图中更新 @State变量?
struct ContentView: View {
@State var inputs1:Array<String> = ["*", "*", "*"]
@State var inputs2:Array<String> = ["*", "*", "*"]
var body: some View {
VStack(alignment: .center) {
let inputRow1 = createRow(inputs1[0], inputs1[1], inputs1[2])
inputRow1
let inputRow2 = createRow(inputs2[0], inputs2[1], inputs2[2])
inputRow2
let enterButton = EnterButtonView()
enterButton
}
}
createRow函数如下:
func createRow(_ letter1:String, _ letter2:String, _ letter3:String) -> some View {
var aSimpleRow : some View {
HStack(alignment: .center) {
Text(letter1)
Text(letter2)
Text(letter3)
}
}
我需要通过Enter按钮以某种方式更新 @State var inputArray。例如用户点击后,数组会变成 [\"%\", \"\*\", \"&\"],因此相应的文本框也会更新为相同的字符串值。
我创建了一个Button结构体:
struct EnterButtonView: View {
var body: some View {
Button(action: {
enterButtonFunction()
}) { // The label view
HStack {
Text("ENTER")
}
}
}
}
我可以很容易地创建一个返回更新后数组的函数,但我不清楚如何将该返回值整合到Content View中,从而更新其中一个inputArrays。
我一直在研究 @State变量及其工作原理,我认为在这里应该用它来实现这个目的,但遇到这个问题时我可能走偏了。我看到有人提到binding,但似乎是用来在两个视图之间传递信息。也许在这里也适用,因为按钮是一个视图,而Content View也是它自己的视图。我只是还不确定该如何着手。
解决方案
你应该在 EnterButtonView 中添加一个 Binding。然后你就可以在按钮的action闭包中把它设置为你想要的任意值:
struct EnterButtonView: View {
@Binding var input: [String]
var body: some View {
Button {
// for example:
input = ["%", "*", "&"]
} label: {
HStack {
Text("ENTER")
}
}
}
}
在 ContentView 中,可以传入 $inputs1 或 $inputs2,具体取决于你希望Enter按钮修改的是哪一个数组。
EnterButtonView(input: $inputs1) // or $inputs2
与其有一个 createRow 函数,不如更地道地再创建一个额外的 View 结构体,示例如下:
struct ContentView: View {
@State var inputs1 = ["*", "*", "*"]
@State var inputs2 = ["*", "*", "*"]
var body: some View {
VStack {
SimpleRow(inputs1[0], inputs1[1], inputs1[2])
SimpleRow(inputs2[0], inputs2[1], inputs2[2])
EnterButtonView(input: $inputs1)
}
}
}
struct SimpleRow: View {
let letter1: String
let letter2: String
let letter3: String
init(_ letter1: String, _ letter2: String, _ letter3: String) {
self.letter1 = letter1
self.letter2 = letter2
self.letter3 = letter3
}
var body: some View {
HStack {
Text(letter1)
Text(letter2)
Text(letter3)
}
}
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。