Swiftui 如何访问另一个视图中的变量?

Swiftui 如何访问另一个视图中的变量?,swiftui,Swiftui,我想访问不同视图中变量的值,并得到它们的总和。我尝试使用environmentObject和绑定变量以不同的方式来实现它,但失败了 我举了两个不同观点的例子如下: 第一视图: struct questionOne: View { @State var isSelected = false @State var score1 = 0 func onClick() { score1 += 1 } var body: some View {

我想访问不同视图中变量的值,并得到它们的总和。我尝试使用environmentObject和绑定变量以不同的方式来实现它,但失败了

我举了两个不同观点的例子如下:

第一视图:

struct questionOne: View {
    @State var isSelected = false

    @State var score1 = 0

    func onClick() {
        score1 += 1
    }

    var body: some View {
        VStack(alignment: .center) {

            Button(action: {self.onClick(); self.isSelected.toggle()}) {
                Text("AAA")
            }
        }
    }
}
第二种观点:

struct questionTwo: View {
    @State var isSelected = false

    @State var score2 = 0

    func onClick() {
        score2 += 1
    }

    var body: some View {
        VStack(alignment: .center) {

            Button(action: {self.onClick(); self.isSelected.toggle()}) {
                Text("BBB")
            }
        }
    }
}
在第三个视图中,我想从第一个视图中获取score1变量,从第二个视图中获取score2变量,并对它们进行总结

struct ResultPage: View {
    var body: some View {
        Text("Your score is \(score1) + \(score2)")
    }
}

我已经在import SwiftUI下的视图控制器之外声明了变量。这样,我就可以访问它们的值。

我已经在导入SwiftUI下的视图控制器之外声明了变量。这样我就可以访问它们的值。

@State
用于视图本身。如果您想从视图外部使用变量,则应该考虑使用另一个包装器,如<代码> @绑定< /代码>。我重构了您的代码,下面是它现在的样子:

struct QuestionView: View {
    let text: String
    @State var isSelected = false
    @Binding var score: Int

    var body: some View {
        Button(text) { self.score += 1; self.isSelected.toggle() }
    }
}
因此,现在
QuestionView
可重用,足以传递所需的参数,如下所示:

struct ContentView: View {

    @State var score1 = 0
    @State var score2 = 0

    var body: some View {
        VStack {
            Text("\(score1) - \(score2)")
            QuestionView(text: "AAA", score: $score1)
            QuestionView(text: "BBB", score: $score1)
        }
    }
}

如您所见,现在维护
score
s的责任在父视图上。因此它可以访问并使用它们。

@State
用于视图本身。如果您想从视图外部使用变量,则应该考虑使用另一个包装器,如<代码> @绑定< /代码>。我重构了您的代码,下面是它现在的样子:

struct QuestionView: View {
    let text: String
    @State var isSelected = false
    @Binding var score: Int

    var body: some View {
        Button(text) { self.score += 1; self.isSelected.toggle() }
    }
}
因此,现在
QuestionView
可重用,足以传递所需的参数,如下所示:

struct ContentView: View {

    @State var score1 = 0
    @State var score2 = 0

    var body: some View {
        VStack {
            Text("\(score1) - \(score2)")
            QuestionView(text: "AAA", score: $score1)
            QuestionView(text: "BBB", score: $score1)
        }
    }
}

如您所见,现在维护
score
s的责任在父视图上。因此,它可以访问并使用它们。

谢谢!你的方式更加优雅。这就是你想要的吗?我用全局变量版本得到了我想要的。但在未来,对于更复杂的应用程序,我肯定会使用你的方式。是的,它是有效的。尽管这并不是你们如何访问另一个视图中的变量。它是全球性的,就像一个解决办法。尽量不要使用太多全局变量。谢谢!你的方式更加优雅。这就是你想要的吗?我用全局变量版本得到了我想要的。但在未来,对于更复杂的应用程序,我肯定会使用你的方式。是的,它是有效的。尽管这并不是你们如何访问另一个视图中的变量。它是全球性的,就像一个解决办法。尽量不要使用太多的全局变量。这是全局变量。它们将一直存在于你的应用程序中,直到你完全关闭应用程序。所以我认为这不是一个好主意。你只需要传入和传出你的变量,就像我在《全局变量》一书中提到的那样。它们将一直存在于你的应用程序中,直到你完全关闭应用程序。所以我认为这不是一个好主意。您可以像我在中提到的那样传入和传出变量