SwiftUI TextField绑定到Double不适用于自定义格式化程序

G J*_*G J 8 swiftui

我有一个绑定到由SwiftUI TextField设置的Double参数。我使用了一个自定义格式化程序,它可以与Double值相互转换。TextField在编辑时将一个空字符串“”发送给Formatter,因此转换失败并且Double参数不会更新。从具有@ObjectBinding参数的父视图调用该结构,而Double是该对象的参数。

我当前正在使用Xcode 11 beta 3和macOS Catalina Beta3。如果参数为String,则TextField可以工作。问题似乎是需要格式化程序的非字符串类型无法正确更新@Binding值。
这是格式化程序:

public class DoubleFormatter: Formatter {

    override public func string(for obj: Any?) -> String? {
        var retVal: String?
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal

        if let dbl = obj as? Double {
            retVal = formatter.string(from: NSNumber(value: dbl))
        } else {
            retVal = nil
        }

        return retVal
    }

    override public func getObjectValue(_ obj: AutoreleasingUnsafeMutablePointer<AnyObject?>?, for string: String, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool {

        var retVal = true

        if let dbl = Double(string), let objok = obj {
            objok.pointee = dbl as AnyObject?
            retVal = true
        } else {
            retVal = false
        }

        return retVal

    }
}
Run Code Online (Sandbox Code Playgroud)

这是在文本字段中采用Double参数的SwiftUI视图

struct HStackTextTextField : View {
    var text: String
    @Binding var value: Double
    @State var valueState: Double

    var body: some View {
        HStack {
            Text("\(value)") //shows the value failing to update 
            TextField("Number", value: $value, formatter: DoubleFormatter()) //Still Fails
            Text("\(valueState)") //shows valueState updating properly
            TextField("Number", value: $valueState, formatter: DoubleFormatter()) //works as expected
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望输入时更新TextField值,但不会更新。当我在格式化程序中跟踪值时。提供给getObjectValue的字符串是“”,而不是TextField中的值。

更新:从catalina / Xcode beta 5开始,当将View TextField参数定义为@Binding并传递给View时,这似乎仍然是一个问题。如果将TextField参数定义为@State且在View本地,则它将按预期工作。

KRH*_*KRH 6

我相信这是 SwiftUI 中的一个错误。(请参阅我的类似问题:带有格式化程序的 SwiftUI TextField 不起作用?

在 beta 2 中,它根本不起作用。在 beta 3 中,我认为您会发现如果(且仅当)您在字段中输入后按回车键,您的结果就会传递给您的格式化程序。希望在测试版 4 中他们将完成修复错误!

  • 我编辑了原始问题,因为问题似乎是 @Binding 无法与 TextField 和格式化程序一起正常工作 (2认同)