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

iru*_*eee 5 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")
            }

Run Code Online (Sandbox Code Playgroud)

视图 1 中的文本仍显示在视图 1 中计算的数字

39f*_*edy 5

如果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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

View2:

struct SecondView: View {
    @Binding var count: Int
    var body: some View {
        Button(action: {self.count = 0}) {
            Text("Reset")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

如果它们是完全不同的观点并且需要单一的事实来源,您可以使用 observableObject/EnvironmentVariables。最好的方法是将环境变量添加到ContentView它在SceneDelegate

ContentView().environmentObject(SourceOfTruth())

这是 SourceOfTruth:

class SourceOfTruth: ObservableObject{
    @Published var count = 0
}
Run Code Online (Sandbox Code Playgroud)

然后您可以将 EnvironmentObjects 用于其他视图:这是ContentView

struct ContentView: View {
    @EnvironmentObject var truth: SourceOfTruth
    var body: some View {
        VStack {
            FirstView()
            SecondView()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是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("-")
           }
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是SecondView

struct SecondView: View {
    @EnvironmentObject var truth: SourceOfTruth
    var body: some View {
        Button(action: {self.truth.count = 0}) {
            Text("Reset")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)