如何在SwiftUI中将变量从一个视图传递到另一个视图

时间:2019-10-18 16:05:04

标签: ios swiftui

我试图在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中计算出的数字

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