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

最近趁着放假时间,在看The Big Nerd Ranch的iOS编程,想着从新复习一遍iOS开发的基础知识编程

因而从这一篇开始记录一些学习过程当中遇到的小问题app

书中第四章有一个温度转换的app实现,总体实现并不难,而此次记录的重点在于利用UITextFieldDelegate委托限制UITextField的输入ide

 

UITextFieldDelegate里面有个函数函数

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool

简单来讲,就是经过这个函数处理输入的请求,而后返回bool值,对应是否修改文本学习

书中本来的要求是限制TextField中只能输入一个小数点,已经给出了相关实现spa

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方法,对已输入的字符串和待输入的字符串中的小数点进行查找code

后面留了一个课后题:要求使用CharacterSet实现禁止字母的输入,我这里直接实现了只能输入数字和小数点的限制blog

首先初始化一个只含小数点和数字的CharacterSetci

let characterSet = CharacterSet.init(charactersIn: ".0123456789")

而后一样是在replacementString中对characterSet中的字符进行查找,若是结果不为空返回false开发

if string.rangeOfCharacter(from: characterSet) == nil {
            return false
}

把这些所有写到前面的textField函数中,编译运行会发现一个问题——删除键失效了

从新认真看documentation,会发现实际上在按下删除键的时候textField函数也被调用了,可是replacementString会是一个空字符串,而前面没有考虑这个问题,就会致使删除键失效

修改以后以下

if string.rangeOfCharacter(from: characterSet) == nil,
    !string.isEmpty {
    return false
}
相关文章
相关标签/搜索