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

时间:2019-11-23 14:03:01

标签: variables swiftui access

我想在不同的视图中访问变量的值并求和。我尝试使用environmentObject和Binding变量以不同的方式进行操作,但是失败了。

我有两个不同视图的示例,如下所示:

第一视图:

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)")
    }
}

2 个答案:

答案 0 :(得分:1)

@State用于视图本身。如果要从视图外部使用变量,则应考虑使用另一个包装器,例如@Binding。我重构了您的代码,这是现在的样子:

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的责任在父视图上。因此,它可以访问它们并且可以使用它们。

答案 1 :(得分:-1)

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