简体   繁体   English

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

[英]How to pass variable from one view to another in SwiftUI

I'm trying to pass one variable from one view to another in SwiftUI.我试图在 SwiftUI 中将一个变量从一个视图传递到另一个视图。 I have a reset button in which I want to set the variable to zero in the other view.我有一个重置按钮,我想在另一个视图中将变量设置为零。

I have tried creating a new struct in view one and accessing that variable in view 2.我尝试在视图 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")
            }

Text in view one is still showing the number that was computed in View 1视图 1 中的文本仍显示视图 1 中计算的数字

If View2 is being used in View1 you could do something like this:如果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)
        }
    }
}

And View2:View2:

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

Edit编辑

If they are completely different views and need single source of truth you could use an observableObject/EnvironmentVariables.如果它们是完全不同的视图并且需要单一的事实来源,您可以使用 observableObject/EnvironmentVariables。 The best way would be to add the environment variable to the ContentView where it's first defined in the SceneDelegate最好的方法是将环境变量添加到在SceneDelegate中首次定义的ContentView

ContentView().environmentObject(SourceOfTruth())

Here is SourceOfTruth:这是SourceOfTruth:

class SourceOfTruth: ObservableObject{
    @Published var count = 0
}

Then you could use EnvironmentObjects to the other views: Here is ContentView :然后您可以将 EnvironmentObjects 用于其他视图:这是ContentView

struct ContentView: View {
    @EnvironmentObject var truth: SourceOfTruth
    var body: some View {
        VStack {
            FirstView()
            SecondView()
        }
    }
}

Here is FirstView :这是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("-")
           }
       }
    }
}

Here is SecondView :这是SecondView

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM