绑定到SwiftUI Mac应用程序中的结构属性
我正在SwiftUI中构建macOS单元转换器应用程序。在下面的示例中,我有一个加速视图,它有许多文本字段。这些文本字段表示不同的加速度单位绑定到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
// 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包装器。这非常有效,再次感谢您的帮助。