刚接触 iOS不久,接到一个iOS项目,其中有一个需求就是在一个 UITextField中只能输入数字和小数点,这个需求在Android中非常容易,只需要设置
EditText
android:id="@+id/id_et_price"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:inputTy服务器托管网pe="numberDecimal"
android:lines="1"
android:singleLine="true" />
只需要设置 android:inputType="numberDecimal"
即可。
我原本以为 iOS 应该也很简单,然后问了一下 gpt
, 果然也是类似的配置:
textField.keyboardType = .numberPad
如果允许小数点,那么就可以使用
textField.keyboardType = .decimalPad
当然,这是最基本的,但是 iOS
中比较坑爹的是,如果用户使用外接键盘或者复制粘贴,仍然可以输入非数字字符。什么意思呢?,假如我们现在复制了一个 “23.34元”, 现在我可以粘贴到 UITextField
中,那么不能输入数字的UITextField
仍然可以输入,且显示为”23.34元“,最后我们提交数据时,就会产生问题。
如何解决这个问题呢?其实解决方案也比较多,这里我给出一种比较常见的解决方案,就是直接继承自UITextField
,对paste
事件进行监听,对输入的字符串进行校验, 非数字和小数点字符直接去掉。
class NumericTextField : UITextField {
override func awakeFromNib() {
super.awakeFromNib()
self.keyboardType = .numberPad
self.delegate = self
}
override func paste(_ sender: Any?) {
if let pasteboardString = UIPasteboard.general.string {
//创建一个字符集包含数字和小数点
let allowedCharacterSet = CharacterSet(charactersIn: ".0123456789")
服务器托管网 //使用字符集分割字符串,移除不在字符中的字符
let filteredString = pasteboardString.components(separatedBy: allowedCharacterSet.inverted).joined()
if let _ = Float(filteredString), !filteredString.isEmpty {
if let selectedRange = self.selectedTextRange {
self.replace(selectedRange, withText: filteredString)
}
}
}
}
}
extension NumericTextField : UITextFieldDelegate {
func textField(_ textField: UITextField,
shouldChangeCharactersIn range: NSRange,
replacementString string: String) -> Bool {
if(string.isEmpty) {
return true
}
// 检查输入的字符是否是数字
let allowedCharacters = CharacterSet(charactersIn: ".0123456789")
let characterSet = CharacterSet(charactersIn: string)
return allowedCharacters.isSuperset(of: characterSet)
}
}
那么用起来直接可以使用 NumericTextField
替代 UITextField
即可。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: Visual Studio 2010+C#实现信源编码
1. 要求 本文设计了一套界面系统,该系统能够实现以下功能: 克劳夫特不等式的计算,并且能够根据计算结果给出相应的信息。 可通过用户输入的初始条件然后给出哈夫曼编码以及LZ编码,结果均通过对话框来显示 哈夫曼编码结果包含相应的码字,信源熵,平均码长以及编码效率…