ios 如何< Float>< String>在SwiftUI中使用扩展从绑定到绑定进行桥接?

9ceoxa92  于 2023-05-30  发布在  iOS
关注(0)|答案(1)|浏览(125)

上下文

我有一个BindingExtension限制为Float,它将其转换为String,以与SwiftUITextField一起使用。然而,我遇到了两个奇怪的行为,而无法确定引起的问题:
1.当输入超过4位数字时,例如12345,TextField清空
1.当输入小数点分隔符(例如“.”在美国),则TextField清空

编码

public extension Binding where Value == Float {
    var adapter: Binding<String> {
        Binding<String>(
            get: {
                guard self.wrappedValue != -1 else { return "" }
                
                let formatter = NumberFormatter()
                formatter.locale = Locale.current
                formatter.numberStyle = .decimal
                
                return formatter.string(from: NSNumber(value: self.wrappedValue)) ?? ""
            },
            set: {
                let formatter = NumberFormatter()
                formatter.locale = Locale.current
                formatter.numberStyle = .decimal
                
                self.wrappedValue = formatter.number(from: $0)?.floatValue ?? -1
            }
        )
    }
}

问题

  • 是什么原因导致了这些错误?如何实现从Binding<Float>桥接到Binding<String>的目标?
1rhkuytd

1rhkuytd1#

不要重新发明轮子,而是使用新的格式样式

@State private var value: Float = 0

var body: some View {
    //...
    TextField("Value", value: $value, format: .number)
    //...
}

相关问题