我想在不同的视图中访问变量的值并求和。我尝试使用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)
}
}
我已经在导入SwiftUI下的视图控制器外部声明了变量。这样我就可以访问它们的值。
@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
的责任在父视图上。因此,它可以访问它们并且可以使用它们。