如何在值转换后使用自定义SwiftUI绑定的Setter



我有一个自定义的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)")
})
}
}

}

相关内容

  • 没有找到相关文章

最新更新