Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
绑定到SwiftUI Mac应用程序中的结构属性_Swift_Macos_Swiftui - Fatal编程技术网

绑定到SwiftUI Mac应用程序中的结构属性

绑定到SwiftUI Mac应用程序中的结构属性,swift,macos,swiftui,Swift,Macos,Swiftui,我正在SwiftUI中构建macOS单元转换器应用程序。在下面的示例中,我有一个加速视图,它有许多文本字段。这些文本字段表示不同的加速度单位 // AccelerationView.swift struct AccelerationView: View { @State private var accel = Acceleration() @EnvironmentObject var formatter: Formatter var body: some View

我正在SwiftUI中构建macOS单元转换器应用程序。在下面的示例中,我有一个加速视图,它有许多文本字段。这些文本字段表示不同的加速度单位

// AccelerationView.swift

struct AccelerationView: View {

    @State private var accel = Acceleration()
    @EnvironmentObject var formatter: Formatter

    var body: some View {

        VStack(alignment: .leading) {
            Text("Metric").font(.subheadline)
            HStack {
                TextField("kilometer per second squared", value: $accel.kilometerPerSecondSquare, formatter: formatter.numberFormatter).frame(width: 120)
                Text("km/s²").frame(width: 60, alignment: .leading)
            }
            HStack {
                TextField("meter per second squared", value: $accel.meterPerSecondSquare, formatter: formatter.numberFormatter).frame(width: 120)
                Text("m/s²").frame(width: 60, alignment: .leading)
            }
            HStack {
                TextField("millimeter per second squared", value: $accel.millimeterPerSecondSquare, formatter: formatter.numberFormatter).frame(width: 120)
                Text("mm/s²").frame(width: 60, alignment: .leading)
            }
            // and so on ...
        }
        .padding()

    }
}
我想将HStack放入它自己的文件中,以清理视图中的代码。我的尝试如下所示:

// UnitTextField.swift

struct UnitTextField: View {

    @State var value: Double = 0.0
    let placeHolder: String
    let label: String
    var fieldWidth: CGFloat = 120
    var labelWidth: CGFloat = 60

    @EnvironmentObject private var formatter: Formatter

    var body: some View {
        HStack {
            TextField(placeHolder, value: $value, formatter: formatter.numberFormatter)
                .frame(width: fieldWidth)
                .multilineTextAlignment(.trailing)
            Text(label)
                .frame(width: labelWidth, alignment: .leading)
        }
    }
}
这不起作用,因为UnitTextField
未正确绑定到加速结构。我正在尝试完成这样的事情,我可以在AccelerationView中使用:

// AccelerationView.swift

struct AccelerationView: View {

    @State private var accel = Acceleration()
    @EnvironmentObject var formatter: Formatter

    var body: some View {

        VStack(alignment: .leading) {
            Text("Metric").font(.subheadline)
            UnitTextField(value: $accel.kilometerPerSecondSquare, placeHolder: "kilometer per second squared", label: "km/s²")
            UnitTextField(value: $accel.meterPerSecondSquare, placeHolder: "meter per second squared", label: "m/s²")
            UnitTextField(value: $accel.millimeterPerSecondSquare, placeHolder: "millimeter per second squared", label: "mm/s²")
            // and so on ...
        }
        .padding()
    }
}

关于如何在macOS应用程序的SwiftUI中正确实现这一点,有什么建议吗?

如果要从您要完成的任务(最后一个快照)开始,那么我认为您需要

struct UnitTextField: View {
    @Binding var value: Double
而不是

struct UnitTextField: View {
    @State var value: Double = 0.0

绑定
环境对象
类似:

 class MyFormat: Formatter, ObservableObject{
                var numberFormat = NumberFormatter()
            }


            struct UnitTextField: View {

                @Binding var value: Double
                let placeHolder: String
                let label: String
                var fieldWidth: CGFloat = 120
                var labelWidth: CGFloat = 60

                @EnvironmentObject  var formatter: MyFormat

                var body: some View {
                    HStack {
                        TextField(placeHolder, value: $value, formatter: formatter.numberFormat)
                            .frame(width: fieldWidth)
                            .multilineTextAlignment(.trailing)
                        Text(label)
                            .frame(width: labelWidth, alignment: .leading)
                    }
                }
            }

            struct Acceleration{
                var kilometerPerSecondSquare : Double = 0.0
                var meterPerSecondSquare : Double = 1.0
                var millimeterPerSecondSquare : Double = 2.0

            }


            struct AccelerationView: View {

                @State private var accel = Acceleration()
                @EnvironmentObject var formatter: MyFormat

                var body: some View {

                    VStack(alignment: .leading) {
                        Text("Metric").font(.subheadline)
                        UnitTextField(value: $accel.kilometerPerSecondSquare, placeHolder: "kilometer per second squared", label: "km/s²").environmentObject(formatter)
                        UnitTextField(value: $accel.meterPerSecondSquare, placeHolder: "meter per second squared", label: "m/s²").environmentObject(formatter)
                        UnitTextField(value: $accel.millimeterPerSecondSquare, placeHolder: "millimeter per second squared", label: "mm/s²").environmentObject(formatter)
                        // and so on ...
                    }
                    .padding()
                }
            }

这个短语我需要用struct而不是double创建UnitTextField。不是很清楚,并且与上一个代码快照不相关。@Asperi我编辑了我的问题以澄清问题。我忘记了@Binding包装器。这非常有效,再次感谢您的帮助。