【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
}
作者:Minerw
出处:https://www.cnblogs.com/minerw/p/12188021.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 本地部署 DeepSeek:小白也能轻松搞定!
· 普通人也能轻松掌握的20个DeepSeek高频提示词(2025版)