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

问题描述 投票:0回答:2

我想在不同的视图中访问变量的值并求和。我尝试使用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")
        }.buttonStyle(SelectedButtonStyle(isSelected: self.$isSelected)).padding(10)
  }
  }

第二视图:

 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")
        }.buttonStyle(SelectedButtonStyle(isSelected: self.$isSelected)).padding(10)
     }
    }

在第三个视图上,我想从第一个视图中获取score1变量,从第二个视图中获取score2变量并将它们加起来。

struct ResultPage: View {
var body: some View {

Text("Your score is \(score1) + \(score2)")

   }
}

我不知道是否有必要,但这是我正在使用的按钮样式。

struct SelectedButtonStyle: ButtonStyle {

@Binding var isSelected: Bool

public func makeBody(configuration: Self.Configuration) -> some View {
    configuration.label
        .padding(20)
        .foregroundColor(.white)
        .background(isSelected ? Color.green : Color.gray)
        .cornerRadius(10.0)
    }
}
variables swiftui access
2个回答
0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.