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

时间:2019-06-30 00:48:07

标签: 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

1 个答案:

答案 0 :(得分:0)

这很容易通过Bindings完成。由于mhzValue@State属性包装器进行了标记,因此它具有关联的绑定。因此,您可以在 second 视图中声明一个@Binding变量,并使用绑定到原始变量对其进行初始化。

struct NextView : View {
    @Binding var mhzValue: Float
    ...
}

当您将NextView指定为导航按钮的目标位置时,将其绑定到mhzValue。 (美元符号语法是引用绑定的一种简便方法。)

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

然后您可以在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)
        }
    }
}

您在mhzValue中对NextView所做的任何更改将实际上是对ContentView.mhzValue的更改。