SwiftUI问题将变量传递给另一个视图

Cra*_*ine 2 view swiftui

我想将Float变量从一个视图传递到另一个新视图。

在下面的代码中,有一个称为mhzValue的Float值,该值是通过Slider设置的,滑块会更改该值,然后Text将显示在视图中。当用户点击Navigation Button来显示新视图时,我希望能够使用mhzValue并将其显示在文本框中的新视图中,并将其设置为另一个变量。

希望有道理。

请在下面查看一些示例代码。

谢谢。

克雷格

import SwiftUI
struct ContentView : View {
    @State private var mhzValue : Float = 0
    var body: some View {
        // Navigation View
        NavigationView {

            VStack{
                Text("Test Value:")
                    .font(.headline)
                    .color(.blue)
                    .padding(.leading, -180.0)

                //Get Slider Value
                Slider(value: $mhzValue, from: 1, through: 55, by: 1)
                    .padding(.horizontal)
                //Display Slider Value
                Text("\(Int(mhzValue)) Value")
                    .font(.title)
                    .fontWeight(.semibold)
                    .color(.blue)
                // Naviagtion Button and send value of mhzValue to new View
                NavigationButton(destination: NextView()){
                    Image(systemName: "plus.square.fill")
                        .foregroundColor(.white)
                        .font(/*@START_MENU_TOKEN@*/.title/*@END_MENU_TOKEN@*/)
                        .frame(width: 150.0, height: 16.0)
                        .padding(15)
                        .background(Color.red)
                        .cornerRadius(10.0)
                }
            }
        }
    }
}

// New View to show Slider Value
struct NextView : View {
    var body: some View {
        Text("Display Slider Value Here:")

    }
}

#if DEBUG
struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
#endif
Run Code Online (Sandbox Code Playgroud)

Chr*_*our 6

使用Bindings可以很容易地做到这一点。因为mhzValue标记有@State属性包装器,所以它具有关联的Binding。因此,您可以@Binding第二个视图中声明一个变量,并使用绑定到原始变量对其进行初始化。

struct NextView : View {
    @Binding var mhzValue: Float
    ...
}
Run Code Online (Sandbox Code Playgroud)

当您指定NextView为导航按钮的目的地时,将Binding传递给mhzValue。(美元符号语法是引用绑定的一种简便方法。)

struct ContentView : View {
    @State private var mhzValue : Float = 0
    ...
    NavigationButton(destination: NextView(mhzValue: self.$mhzValue)){...}
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以mhzValue在内部使用NextView

struct NextView : View {

    @Binding var mhzValue: Float

    var body: some View {
        VStack{
            Text("Display Slider Value Here:")
            Text("\(Int(mhzValue)) Value")
                .font(.title)
                .fontWeight(.semibold)
                .color(.blue)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你做出的任何更改mhzValueNextView将有效地改变ContentView.mhzValue

  • 好答案。一个关于它的问题。正如我在评论中指出的,“mhzValue”被标记为“private”。这有关系吗?(实际上我很惊讶它的构建没有任何警告或错误。) (2认同)
  • 真是太好了……谢谢……正如我在上面提到的,我在回忆时遇到了困难……我想我永远都不会掌握它。因此,我将依靠像你这样的人为你提供持续的帮助。谢谢..克雷格。 (2认同)