首页 > 解决方案 > 将变量传递给另一个视图的 SwiftUI 问题

问题描述

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

在下面的代码中有一个名为 mhzValue 的浮点值,它是通过滑块设置的,滑块会更改值,然后文本会显示在视图中。当用户点击导航按钮以显示新视图时,我希望能够获取 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

标签: viewswiftui

解决方案


这很容易通过Bindings完成。因为mhzValue是用@State属性包装器标记的,所以它有一个关联的Binding。因此,您可以在第二个视图中声明一个@Binding变量,并使用 Binding 将其初始化为原始变量。

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

当您指定NextView导航按钮的目的地时,将其传递给 Binding to 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)
        }
    }
}

您对 inside 所做的任何更改都mhzValueNextView有效地更改为ContentView.mhzValue.


推荐阅读