按预期在键盘上打字会触发.onChange,因此,除非用户删除了TextField中的所有字符,否则控制台会正确地打印"更改".

struct CurrencyInput: View {
    @State var value: Double = 0
    
    var body: some View {
        TextField("Amount", value: $value, format: .number)
            .keyboardType(.decimalPad)
            .onChange(of: value) {
                print("changed")
                print(value)
            }
    }
}

从空的TextField开始,然后输入数字2,后跟一个退格符,我想应该是这样

预期的控制台日志(log)

changed
2
changed
0

不过,我只得到这个

实际控制台日志(log)

changed
2

TextField绑定更改为String似乎可以解决问题,但是我不能使用格式化程序.

struct CurrencyInput: View {
    @State var value: String = ""
    
    var body: some View {
        TextField("Amount", text: $value)
            .onChange(of: value) {
                print("changed")
                print(value)
            }
    }
}

上面的代码正确地控制台记录了这一点:

changed
2
changed

我认为问题源于这样一个事实,即如果绑定变量是Double,则空的TextField被视为0.但我仍然认为应该拨打.onChange.当用户删除所有字符时,您有什么 idea 可以通知我吗?

推荐答案

使用onChange无法检测到这一点,因为value不等于change.当文本字段变为空时,解析失败,因此value不会更改.

您可以使用可选的Double,即Double?来检测文本何时从可解析变为不可解析,反之亦然:

@State var value: Double?

var body: some View {
    TextField("Amount", value: $value, format: .number)
        .keyboardType(.decimalPad)
        .onChange(of: value) {
            print("changed")
            if let value {
                print(value)
            }
        }
}

例如,文本字段最初是空的,您输入"1",将调用onChange(value从nil更改为1).删除"1"也会导致调用onChange(value从1更改为零).

但是,这并不能检测到所有的文本更改.例如,当文本从A更改为B时,不会调用onChange,因为两个文本都无法解析,而value保持不变(Nil).

如果你想检测every文本的变化,你可以用need来检测String.它仍然有可能拥有Double的房产.您可以将其编写为分析String状态的计算(computed)属性.

var value: Double? {
    try? FloatingPointFormatStyle.number.parseStrategy.parse(text)
}

@State var text: String = ""

var body: some View {
    TextField("Amount", text: $text)
        .keyboardType(.decimalPad)
        .onChange(of: text) {
            print("changed")
            if let value {
                print(value)
            }
        }
}

Swift相关问答推荐

我应该在自定义存储队列上使用弱self 吗?

如何在HStack中均匀分布视图?

在用户将输入保存到SWIFT中的核心数据后,如何创建指向我的应用程序S主页的链接?

并发访问SWIFT中数组的非重叠子范围

在NavigationStack上设置拐角半径:SwiftUI中的无响应内容视图区

使 tabview 垂直将视图移动到右侧 swift ui

为什么 Swift URL 的 init?(string: String,relativeTo: URL?) 仅添加协议?

SwiftUI路径平滑连接两条线

如何从 RC 加载场景作为 ModelEntity 而不是普通实体?

macOS 的窗口框架中使用的真实类型和真实类型是什么?

为什么即使 `C` 是一个不是 `Sendable` 的类,Task` 也能工作?

ConfirmationDialog取消swiftui中的错误

如何使用带有 span 样式标签的 Swift XMLParser

闭包 - deinit self 对象的时间

无法分配给属性:absoluteString是一个只能获取的属性

如何在 RxSwift 中获取 controlEvent 类型?

SwiftUI 文本被意外截断

FCM 后台通知在 iOS 中不起作用

快速在 LLDB 中使用 po

如何在 SwiftUI 中的一个视图上显示两个alert ?