枢覆引 发表于 2025-6-3 10:37:55

【iOS】UITextField中的输入检测——限制只能输入数字和小数点

问题提出

最近趁着放假时间,在看The Big Nerd Ranch的iOS编程,想着重新复习一遍iOS开发的基础知识
书中第四章有一个温度转换的app实现,整体实现并不难
其中有个问题——如何利用UITextFieldDelegate委托限制UITextField的输入
问题背景

UITextFieldDelegate里面有个函数
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool简单来说,就是通过这个函数处理输入的请求,然后返回bool值,对应是否修改文本
书中原本的要求是限制TextField中只能输入一个小数点,已经给出了相关实现
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        let existingTextHasDecimalSeparator = textField.text?.range(of: ".")
        let replacementTextHasDecimalSepatator = string.range(of: ".")
        if existingTextHasDecimalSeparator != nil, replacementTextHasDecimalSepatator != nil {
                return false
        } else {
                return true
        }
}实现很简单,无非就是利用了Swift中string的range方法,对已输入的字符串和待输入的字符串中的小数点进行查找
解决问题

后面留了一个课后题:要求使用CharacterSet实现禁止字母的输入,我这里直接实现了只能输入数字和小数点的限制
首先初始化一个只含小数点和数字的CharacterSet
let characterSet = CharacterSet.init(charactersIn: ".0123456789")然后同样是在replacementString中对characterSet中的字符进行查找,如果结果不为nil就返回false
if string.rangeOfCharacter(from: characterSet) == nil {
            return false
}把这些全部写到前面的textField函数中,编译运行会发现一个问题——删除键失效了
重新认真看doc,会发现实际上在按下删除键的时候textField函数也被调用了
但是replacementString会是一个空字符串,而前面没有考虑这个问题,就会导致删除键失效
修改之后如下
if string.rangeOfCharacter(from: characterSet) == nil,
    !string.isEmpty {
    return false
}
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

殷罗绮 发表于 2025-11-8 07:24:39

感谢,下载保存了

浦乐 发表于 2026-1-3 12:02:53

很好很强大我过来先占个楼 待编辑

狞嗅 发表于 2026-1-10 11:03:42

分享、互助 让互联网精神温暖你我

蜴间囝 发表于 2026-1-18 17:01:28

很好很强大我过来先占个楼 待编辑

窖咎 发表于 2026-1-20 01:18:00

热心回复!

茅香馨 发表于 2026-1-21 10:19:12

感谢发布原创作品,程序园因你更精彩

巴沛若 发表于 2026-1-22 11:59:02

懂技术并乐意极积无私分享的人越来越少。珍惜

袁可佳 发表于 2026-1-22 14:09:18

这个有用。

疝镜泛 发表于 2026-1-26 12:26:33

yyds。多谢分享

莠畅缕 发表于 2026-1-27 02:02:37

收藏一下   不知道什么时候能用到

冷晓晴 发表于 2026-1-27 08:47:47

谢谢分享,辛苦了

骆熙华 发表于 2026-1-29 04:22:28

前排留名,哈哈哈

羊夏菡 发表于 2026-1-29 08:41:34

很好很强大我过来先占个楼 待编辑

映各 发表于 2026-2-3 05:48:27

谢谢楼主提供!

姚梨素 发表于 2026-2-4 09:35:26

感谢,下载保存了

饨篦 发表于 2026-2-4 16:53:36

热心回复!

劳欣笑 发表于 2026-2-5 10:27:35

收藏一下   不知道什么时候能用到

丝甲坞 发表于 2026-2-5 10:54:18

东西不错很实用谢谢分享

蓬庄静 发表于 2026-2-6 07:19:30

鼓励转贴优秀软件安全工具和文档!
页: [1] 2
查看完整版本: 【iOS】UITextField中的输入检测——限制只能输入数字和小数点