最近趁着放假时间,在看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中的字符进行查找,如果结果不为空返回false

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

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

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

修改之后如下

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

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

  1. JS学习笔记 - 自定义右键菜单、文本框只能输入数字

    <script> // 事件总共有2个部分, //1.点击鼠标右键的表现 oncontextmenu 2.点击鼠标左键的表现(即普通点击onclick) // 点击右键,div位置定位到鼠 ...

  2. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  3. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

  4. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

  5. iOS学习笔记总结整理

    来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...

  6. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

  7. IOS学习笔记之关键词@dynamic

    IOS学习笔记之关键词@dynamic @dynamic这个关键词,通常是用不到的. 它与@synthesize的区别在于: 使用@synthesize编译器会确实的产生getter和setter方法 ...

  8. iOS学习笔记10-UIView动画

    上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...

  9. iOS学习笔记之Category

    iOS学习笔记之Category 写在前面 Category是类别(也称为类目或范畴),使用Category,程序员可以为任何已有的类添加方法.使用类别可以对框架提供的类(无法获取源码,不能直接修改) ...

随机推荐

  1. zabbix_agent_win

    http://mayulin.blog.51cto.com/1628315/514447/ http://www.cnblogs.com/likehua/p/3968689.html 先下载win客户 ...

  2. hdu 3388 Coprime

    第一个容斥的题,感觉这东西好神啊.于是扒了一发题解2333 首先想对于[1,x]内有多少与n,m都互质的数,显然x是存在单调性的,所以可以二分一下. 那么互质的数的求法,就是x-存在n,m一个质因数的 ...

  3. GPRS模块

    一.参考网址 1.AT指令(中文详解版)(二)

  4. idea将web项目打成war包放在tomcat/webapps上运行

    1.进入Project Structure 或者 file -> Project Structure 或者 快捷键ctrl+alt+shift+s 2.选中Artifacts 3.点加号,然后如 ...

  5. OC Swift混编-Swift.h File not found

    https://www.jianshu.com/p/f860fe1718ca 2016.09.13 11:53* 字数 266 阅读 1935评论 1喜欢 1 今天碰到个神坑,本人项目是OC项目,最近 ...

  6. POJ - 2718 Smallest Difference(全排列)

    题意:将n个数字分成两组,两组分别组成一个数字,问两个数字的最小差值.要求,当组内数字个数多于1个时,组成的数字不允许有前导0.(2<=n<=10,每个数字范围是0~9) 分析: 1.枚举 ...

  7. 使用文件流创建File文件和目录以及其他的一些操作

    我们创建文件时可以直接通过File f=new File(path)来创建一个文件对象,然后再通过 f.createNewFile() 就创建出来了一个文件.比如设置 path 为 C:\Users\ ...

  8. 【Linux】linux磁盘管理

    在服务器管理中,我们会关心硬盘用了多少,还有多少剩余空间,哪些文件占用空间最大等等.以便我们在合适的时机为服务器添加硬盘分区以及管理磁盘文件等操作,让磁盘的利用率最大化,现在我们看下linux系统中和 ...

  9. js数组,字符转换;key_value获取

    js 数组转字符串js 字符串转数组arr.join(",");String.split(","); 对象的所有keys Object.keys(val)对象的 ...

  10. php对象:get_object_vars(), get_parent_class(),is_subclass_of(),interface_exists()

    get_object_vars():获得对象的属性,以关联数组形式返回 get_parent_class():获得对象的父类 is_subclass_of():判断对象是否某类(参数2)的子类实例出的 ...