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

问题描述 投票:0回答:3

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

在下面的代码中,有一个名为 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
view swiftui
3个回答
54
投票

这可以通过 Bindings 轻松完成。由于

mhzValue
标记有
@State
属性包装器,因此它具有关联的 Binding。因此,您可以在
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
进行更改。


3
投票

该值可以通过 init 传递。即

struct ViewToSendValue: View {
    var body: some View {
        ViewToReceiveValue(valueToPass: "some string")
    }
}

struct ViewToReceiveValue: View { 

    var valueToPass: String = ""

    init(valueToPass: String) {
        self.valueToPass = valueToPass
    }

    var body: some View {
        Text(valueToPass)
    }
}

0
投票

可以使用@State、@Binding、@EnvironmentObject 和@ObserevedObject 来快速传递数据。我在下面的链接中找到了详细的解释。 https://www.coderzheaven.com/2024/01/13/how-data-is-passed-from-one-view-to-another-in-swiftui/

© www.soinside.com 2019 - 2024. All rights reserved.