网站首页 全球最实用的IT互联网站!

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 软件工程 > 后端开发 > Swift >

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

时间:2020-01-13 16:44

人气:

作者:admin

标签:

导读:问题提出 最近趁着放假时间,在看The Big Nerd Ranch的iOS编程,想着重新复习一遍iOS开发的基础知识 书中第四章有一个温度转换的app实现,整体实现并不难 其中有个问题——如何利用UITe...

问题提出

最近趁着放假时间,在看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中stringrange方法,对已输入的字符串和待输入的字符串中的小数点进行查找

解决问题

后面留了一个课后题:要求使用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

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
  • iOS 17新特性以及适配细节汇总

    iOS 17新特性以及适配细节汇总

    1、UIScrollView增加了属性allowsKeyboardScrolling表示是否根据连接的物理键盘的方向键...
  • 最近几天

    最近几天

    8.03周四 一大早电话吵醒,着急给我妈送卡,早上坐车去延安,顺便下来玩玩,...
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信