一个简单的 SwiftUI TextField
,它限制用户输入为数字。
在 https://stackoverflow.com/questions/58733003/swiftui-how-to-create-textfield-that-only-accepts-numbers 中最常见的回复(搜索结果排名第一)只是建议设置一个数字键盘。但这完全忽略了与硬件键盘一起使用的情况。许多建议的
这个 NumericTextModifier
观察一个 String
值的变化,当它改变时,它会过滤掉任何非数字字符并更新字符串。 然后它将该字符串转换为 NSNumber
以方便使用。您可以选择允许整数或浮点数。
NumericTextField
使用 NumbericTextModifier
并且只公开文本中的 NSNumber
。 它可以防止任何非数字文本输入,无论来源如何(粘贴、外部键盘)。 它还管理键盘类型以匹配您所说的允许的数字类型。
标准的 TextFields
有一个 Formatter
,您可以传入该格式化器,它将被用于格式化/验证输入。 但是,这仅在用户完成编辑时发生,而不是每次击键都发生。 因此,用户可以输入 123abc4
并在文本字段中看到它,然后当他们点击回车键时,它将变为 1234
。 这真的不太理想。 使用 NumericTextField
,当他们输入一个非数字字符时,它会被忽略并且永远不会出现在文本字段中。
它的工作方式与 TextField
相同,但您将其绑定到 NSNumber?
而不是 String
。
// Inside your view
@State private var int: NSNumber?
@State private var double: NSNumber?
var body: Some View {
VStack {
NumericTextField("Int", number: $int, isDecimalAllowed: false)
NumericTextField("Double", number: $double, isDecimalAllowed: true)
}
}
// Inside your view
@State private var int: NSNumber?
@State private var intString = ""
@State private var double: NSNumber?
@State private var doubleString = ""
var body: Some View {
VStack {
TextField("Int", text: $intString)
.numericText(text: $intString, number: $int, isDecimalAllowed: false)
TextField("Double", text: $doubleString)
.numericText(text: $doubleString, number: $double, isDecimalAllowed: true)
}
}
使用 Swift Package Manager 或只是将这两个源文件拖放到您的项目中。它支持 iOS 14、macOS 10.16/11、tvOS 14、watchOS 7。
NSNumber?
作为绑定值,并允许绑定 Int?
或 Double?
。 我对此进行了快速尝试,但我的泛型技能不足以解决它。TextField
支持的其他初始化器。欢迎提交拉取请求,以帮助解决这些或您可能发现或想到的任何其他问题。