我想在不同的视图中访问变量的值并求和。我尝试使用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)")
}
}
答案 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下的视图控制器外部声明了变量。这样我就可以访问它们的值。