如何在SwiftUI的TextField中编辑长度单位Measurement类型的值?
编译报错原因
你创建的Measurement<UnitLength>.FormatStyle实例仅遵守FormatStyle协议,不满足带value参数的TextField构造器要求的ParsableFormatStyle协议约束,因此触发类型不匹配错误。
可行解决方案
方案1:使用系统自带可解析测量格式样式(支持带单位输入)
直接使用Measurement<UnitLength>.ParsableFormatStyle类型,该类型原生遵守ParsableFormatStyle协议,可直接传入TextField的format参数,支持用户输入带单位的数值,系统会自动解析转换为对应Measurement<UnitLength>值。
示例代码:
import SwiftUI struct HeightInputView: View { // 声明可解析的长度测量格式样式 private let heightFormatStyle = Measurement<UnitLength>.ParsableFormatStyle( width: .abbreviated, usage: .general, locale: .current ) // 存储房屋高度的测量类型变量,默认单位可自行修改 @State private var houseHeight = Measurement(value: 3.5, unit: UnitLength.meters) var body: some View { TextField("房屋高度", value: $houseHeight, format: heightFormatStyle) .keyboardType(.numbersAndPunctuation) // 适配数字+单位输入 } }
该方案下用户可以直接输入类似6 ft的内容,系统会自动根据当前地区规则转换为你设置的单位存储。
方案2:自定义数值绑定中转(固定单位场景更易用)
如果不需要支持用户切换单位,只想让用户输入纯数值,可通过绑定中转实现,逻辑更简单可控:
import SwiftUI struct HeightInputView: View { // 固定单位为米的高度变量 @State private var houseHeight = Measurement(value: 3.5, unit: UnitLength.meters) // 中转绑定,只暴露数值给TextField private var heightValue: Binding<Double> { Binding( get: { houseHeight.value }, set: { houseHeight.value = $0 } ) } var body: some View { TextField("房屋高度(米)", value: heightValue, format: .number.precision(.fractionLength(0...2))) .keyboardType(.decimalPad) } }
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

