ios - SwiftUI - TextField - 焦点上清除 Double 类型的值,取消选择时恢复

标签 ios swift swiftui textfield

场景:
在 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()
    }
}

有没有办法使用 SwiftUITextField 来做到这一点?

最佳答案

为什么 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/

相关文章:

iOS - 弯曲的圆形 UITextfield

ios - 将尝试通过打破约束来恢复 <NSLayoutConstraint :0x17008b130 UILabel

ios - UISplitViewController从master返回到detail

ios - 从 CKRecord 获取 CKRecordZone

SwiftUI - 带列表的段控制

image - 使用 DispatchQueue 在 SwiftUI 中异步加载图像

ios - 我应该在哪里放置我的全局宏?

ios - 如何快速解析 Firebase FDatasnapshot json 数据

swift - 在 SwiftUI 中点击 MKMapView

ios - 如何让广播应用程序在我的 iOS 应用程序的后台继续播放?