如何在我的视图中更新 @State变量?

移动开发 2026-07-12
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章