SwiftUI文本字段绑定到Double不使用自定义格式化程序

SwiftUI文本字段绑定到Double不使用自定义格式化程序,swiftui,Swiftui,我绑定了一个由SwiftUITextField设置的双参数。我使用一个自定义的格式化程序,它可以转换为双精度值,也可以转换为双精度值。TextField在编辑时向格式设置程序发送一个空字符串“”,因此转换失败,Double参数不会更新。该结构是从父视图调用的,该父视图有一个@ObjectBinding参数,Double是该对象的一个参数 我目前正在使用Xcode 11 beta 3和macOS Catalina beta 3。如果参数是字符串,则文本字段起作用。问题似乎是需要格式化程序的非字符串

我绑定了一个由SwiftUI
TextField
设置的双参数。我使用一个自定义的
格式化程序
,它可以转换为双精度值,也可以转换为双精度值。
TextField
在编辑时向
格式设置程序发送一个空字符串
”,因此转换失败,
Double
参数不会更新。该结构是从父视图调用的,该父视图有一个
@ObjectBinding
参数,
Double
是该对象的一个参数

我目前正在使用Xcode 11 beta 3和macOS Catalina beta 3。如果参数是
字符串
,则
文本字段
起作用。问题似乎是需要
格式化程序的非字符串类型无法正确更新
@Binding
值。
这是格式化程序

公共类双格式化程序:格式化程序{
覆盖公共函数字符串(对象:有?->字符串{
var-retVal:String?
let formatter=NumberFormatter()
formatter.numberStyle=.decimal
如果设dbl=obj为?双精度{
retVal=formatter.string(from:NSNumber(值:dbl))
}否则{
retVal=nil
}
返回返回
}
重写公共函数getObjectValue(j:AutoreleasingUnsafemtablePointer?,对于字符串:string,errorDescription错误:AutoreleasingUnsafemtablePointer?)->Bool{
var retVal=true
如果让dbl=Double(字符串),则让objok=obj{
objok.pointee=dbl作为任何对象?
retVal=true
}否则{
retVal=false
}
返回返回
}
}
下面是在文本字段中接受双参数的SwiftUI视图

struct hstacktextfield:视图{
变量文本:字符串
@绑定变量值:双精度
@状态变量valueState:双精度
var body:一些观点{
HStack{
Text(“\(value)”)//显示更新失败的值
TextField(“Number”,value:$value,格式化程序:DoubleFormatter())//仍然失败
Text(“\(valueState)”)//显示正确更新的valueState
TextField(“Number”,value:$valueState,formatter:DoubleFormatter())//按预期工作
}
}
}
我希望键入时
TextField
值会更新,但它不会。当我在格式化程序中跟踪值时。提供给
getObjectValue
的字符串是
,而不是
文本字段中的值


更新:从catalina/Xcode beta 5开始,当
视图
文本字段
参数定义为
@Binding
并传递到
视图时,这似乎仍然是一个问题。如果
TextField
参数被定义为
@State
并且是视图的本地参数,则它似乎可以正常工作。

我认为这是SwiftUI中的一个错误。(见我的类似问题:)


在beta 2中,它根本不起作用。在beta 3中,我认为您会发现,如果(并且仅当)在字段中键入后单击return,则结果会传递给格式化程序。希望在beta 4中,他们能够完成修复错误

我编辑了原始版本,因为问题似乎是@Binding不能与TextField和formatter一起正常工作。在Xcode 11 GM 2/macOS 10.15 Beta 8中,这仍然是一个问题,我们已经过了一年多,它仍然不能工作。