场景:
在 SwiftUI 中,我的 TextField 具有一个 Double 值。点击/聚焦 TextField
时,当前的 Double
值将被清除,以允许用户轻松输入新值,而无需选择和删除当前值。如果用户没有输入新值,则取消选择时将恢复旧值。
问题
利用.focused()
和.onChange(of:)
这似乎是不可能的。下面的代码正确地清除了该值(在控制台中可见)。但是,更改并未反射(reflect)在 UI 中。通过在 TextField
上使用 .id()
强制更新 UI 会取消选择 TextField
,从而使此解决方法毫无用处。
为什么 UI 没有因 TextField
value 属性的更改而更新?
struct ContentView: View {
@FocusState var focus: Bool
@State var test: Double? = 100
@State var id: UUID = UUID()
var body: some View {
VStack {
TextField("Placeholder", value: $test, format: .number)
.id(id)
.focused($focus)
.onChange(of: focus, perform: { editing in
var oldValue: Double? = test
if editing {
self.$test.wrappedValue = nil
self.$id.wrappedValue = UUID()
} else {
if test == nil {
self.$test.wrappedValue = oldValue
self.$id.wrappedValue = UUID()
}
}
})
}
.padding()
}
}
有没有办法使用 SwiftUI
的 TextField
来做到这一点?
最佳答案
为什么 UI 没有因 TextField 值的更改而更新?
因为它不会直接将 TextField 的值(String)绑定(bind)到您的值(Double)。
要清除焦点上的值,取消选择时恢复
,您需要在带有文本而不是值的 TextField 上执行此操作。这是一个例子:
struct TestView: View {
@FocusState var focus: Bool
@State var value: String = "100"
@State private var oldValue: String = ""
var body: some View {
VStack {
TextField("", text: .constant("other"))
TextField("Placeholder", text: $value)
.focused($focus)
.onChange(of: focus) { editing in
if editing {
if !value.isEmpty {
oldValue = value
value = ""
}
} else {
if value.isEmpty {
value = oldValue
}
}
}
}
.textFieldStyle(.roundedBorder)
.padding()
}
}
如果您只想将其设为 Double,请在外部处理它(在 ViewModel 或其他内容中)
关于ios - SwiftUI - TextField - 焦点上清除 Double 类型的值,取消选择时恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75356128/