我试图在SwiftUI中将一个变量从一个视图传递到另一个视图。我有一个重置按钮,我想在另一个视图中将变量设置为零。
我尝试在视图1中创建一个新结构,并在视图2中访问该变量。
// View 1
@State var count = MyNumber.number
// Body of app
Button(action: {self.count = self.count-10}) {
Text("-")
}
Text("\(count)")
struct MyNumber {
static var number = 0
}
// View 2
@State var countit = MyNumber.number
// Body
Button(action: {self.countit = 0}) {
Text("Reset")
}
视图一中的文本仍显示在视图1中计算出的数字
答案 0 :(得分:1)
如果View2
中使用了View1
,则可以执行以下操作:
View1:
struct FirstView: View {
@State var count = 0
var body: some View {
VStack{
Text("\(self.count)")
Button(action:
{self.count = self.count-10})
{
Text("-")
}
SecondView(count: self.$count)
}
}
}
还有View2:
struct SecondView: View {
@Binding var count: Int
var body: some View {
Button(action: {self.count = 0}) {
Text("Reset")
}
}
}
修改
如果它们是完全不同的视图并且需要单一的事实来源,则可以使用observableObject / EnvironmentVariables。最好的方法是将环境变量添加到ContentView
SceneDelegate
这里是SourceOfTruth:
ContentView().environmentObject(SourceOfTruth())
然后,您可以使用EnvironmentObjects来访问其他视图:
这是class SourceOfTruth: ObservableObject{
@Published var count = 0
}
:
ContentView
这里是struct ContentView: View {
@EnvironmentObject var truth: SourceOfTruth
var body: some View {
VStack {
FirstView()
SecondView()
}
}
}
:
FirstView
这里是struct FirstView: View {
@EnvironmentObject var truth: SourceOfTruth
var body: some View {
VStack{
Text("\(self.truth.count)")
Button(action:
{self.truth.count = self.truth.count-10})
{
Text("-")
}
}
}
}
:
SecondView