网站开发必看书籍,宝安中心医院怎么样,系统花钱做任务的小说魅网站,wordpress 后台忘了刚接触 iOS不久#xff0c;接到一个iOS项目#xff0c;其中有一个需求就是在一个 UITextField中只能输入数字和小数点#xff0c;这个需求在Android中非常容易#xff0c;只需要设置 EditTextandroid:idid/id_et_priceandroid:layout_widthmatch_par…刚接触 iOS不久接到一个iOS项目其中有一个需求就是在一个 UITextField中只能输入数字和小数点这个需求在Android中非常容易只需要设置 EditTextandroid:idid/id_et_priceandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:ellipsizeendandroid:inputTypenumberDecimalandroid:lines1android:singleLinetrue /只需要设置 android:inputTypenumberDecimal 即可。 我原本以为 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 .numberPadself.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 即可。