我有一个自定义的SwiftUI绑定,在它在我的视图中的TextField中呈现之前,我转换一个值。我这样做是因为我想将分钟数(在我的数据库中存储为Int
)转换为两种时间格式之一(HHMM或#.#)。
app.flight
是我的视图模型中ObservableObject
上的@Published
变量。duration
是我的对象的Int
属性,timeForm
是一个扩展,它进行时间转换并返回适当的String
值。
这是我的绑定:
let time = Binding(
get: {
app.flight.duration.timeForm //Converts the Int to a String
},
set: { $0 } <-- ???
)
…这里是我的TextField
在我的视图中,我使用time
绑定:
TextField(timeDisplayHHMM ? "####" : "#.#", text: time, onCommit:{
print(time.wrappedValue) //<-- Prints the initial value from the binding's getter
})
我需要setter完成time
的值设置,以便当我在onCommit
中访问它时,它具有用户输入的最新值。但它打印的是绑定getter的原始值
我如何使我的绑定中的set
语句传递set值,以便在我在onCommit
中使用它时它已经准备好了?
您可以尝试下面的方法:
struct ContentView: View {
@State var timeDisplayHHMM = true
@State var time = ""
@State var app_flight_duration: Int = 0 // <-- for testing
var body: some View {
VStack {
Text("time: " + time)
Text("duration: (app_flight_duration)")
TextField(timeDisplayHHMM ? "####" : "#.#",
text: Binding(
get: { time },
set: {
time = $0
// here convert to int,
// you need to do a lot more than this simple example
if let theInt = Int($0) {
app_flight_duration = theInt // assign to your model
}
}
),
onCommit:{
print("-----> time " + time + " app_flight_duration: (app_flight_duration)")
})
}
}
}