Swift

数值文本

一个简单的 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,当他们输入一个非数字字符时,它会被忽略并且永远不会出现在文本字段中。

用法

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)
    }
}

NumericTextModifier

// 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。

改进建议

欢迎提交拉取请求,以帮助解决这些或您可能发现或想到的任何其他问题。