要限制一个UITextField的输入字数,首先想到的应该是通过

UITextFieldDelegate

的代理方法来限制:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;   // return NO to not change text
比如要设置字数限制为20:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (textField == self.titleField) {
if (textField.length > ) return NO;
} return YES;
}

但是这样的限制简单粗暴,可能会影响用户正常逻辑下的输入,比如输入了20个字符后,要退格回删字符。
这时候我们可能会考虑“Detect backspace in UITextField”,比如简单地判断replacementString的长度是否为0。
接着我们可能还会遇到用户已经输入20个字符了,这时候继续输入---不过是选择了部分文本进行替换-----无法进行了,这也妨碍了用户的正常操作,所以限制的代码版本可能会演进为:

#pragma mark - UITextFieldDelegate

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (textField == self.titleField) {
if (string.length == ) return YES; NSInteger existedLength = textField.text.length;
NSInteger selectedLength = range.length;
NSInteger replaceLength = string.length;
if (existedLength - selectedLength + replaceLength > ) {
return NO;
}
} return YES;
}

到这里可能会觉得基本大功告成了,但是当你输入19个字符后,第20个字符以中文汉字的形式继续输入,那么系统会在键盘上方提供后续的一系列联想词,你会发现通过这种方式可以连续选字输入从而突破20个字符的限制。WTF

到了这里,我们可能会希望有个类似

- (void)textFieldDidChange:(UITextField *)textField

的回调方法,但可惜没有。
当然,我们还可以通过

- (void)textFieldDidEndEditing:(UITextField *)textField;
回调方法在结束编辑的时候把文本截断,虽然在用户体验上会有点突兀。

不过当我们点进去UITextField.h头文件里寻觅上述回调方法而不得时,可能会发现最下面有这么个消息通知名称:

UIKIT_EXTERN NSString *const UITextFieldTextDidChangeNotification;

不过,监听消息还要记得解除监听,通常我还习惯把监听消息的代码统一放在一个方法中,看起来有点“大动干戈”。
所幸的是UITextField本身提供了相应的事件监听:

[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
这样就可以更好地限制输入长度:
- (void)textFieldDidChange:(UITextField *)textField
{
if (textField == self.titleField) {
if (textField.text.length > ) {
textField.text = [textField.text substringToIndex:];
}
}
}
 

更好地限制一个UITextField的输入长度的更多相关文章

  1. UITextField限制输入长度

    首先,汉字的输入时的联想词在输入到TextFiled时,并不会走 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersIn ...

  2. UiTextField 限制输入长度

    -(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementS ...

  3. 简单几步实现 IOS UITextField输入长度的控制

    在ios开发过程中,我们有时候需要对UITextField的输入长度进行控制,比如输入手机号码最大长度为11位等,而ios自身又不像android那样可以设置输入框的输入长度,接下来通过简单几步实现这 ...

  4. 限制 UITextField 输入长度

    限制 UITextField 输入长度 标签(空格分隔): UITextField UITextField 是 iOS 中最经常使用的组件之中的一个.关于它也有各种各样的需求,这些需求是它本身没有提供 ...

  5. 一个页面从输入url到页面加载显示完成,中间都经历了什么

    第一种解释: 一般会经历以下几个过程: 1.首先,在浏览器地址栏中输入url 2.浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容.若没有,则跳到第三步操作. 3 ...

  6. 一个页面从输入URL到加载显示完成,发生了什么?

    面试经典题--URL加载 一.涉及基本知识点: 1. 计算机网络 五层因特尔协议栈: 应用层(dns.http):DNS解析成IP并完成http请求发送: 传输层(tcp.udp):三次握手四次挥手模 ...

  7. iOS UITextField限制输入数字

    有时候项目中要求文本框中只能输入数字,如:价格.公里数.费用等等,一般的文本框不限制输入的格式,这时候只能强制限制输入框的输入格式了,代码如下: #import "ViewControlle ...

  8. 编写一个方法,输入DOM节点,返回包含所有父节点的一个数组

    编写一个方法,输入DOM节点,返回包含所有父节点的一个数组 function getParentsNodes(element) { var parents = []; var getParentsNo ...

  9. 《剑指Offer》第1题(Java实现):在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    一.题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该 ...

随机推荐

  1. Conscription-最小生成树-Kruskal

    Windy has a country, and he wants to build an army to protect his country. He has picked up N girls ...

  2. jquery iframe父子框架中的元素访问方法

    在web开发中,经常会用到iframe,难免会碰到需要在父窗口中使用iframe中的元素.或者在iframe框架中使用父窗口的元素 js 在父窗口中获取iframe中的元素 1. 格式:window. ...

  3. myEclips 中的项目复制重命名

    现在有个项目Pj ,要复制一个Pu 一,退出 myEclips. 二,找到Pj备份一份到其他目录. 三,进入myEclips,F2修改项目名Pj至Pu. 四,将备份拷贝回原目录. 五,将Pj重新引进m ...

  4. AngularJS 中{{}}与ng-bind指令

    面试中,有被问题关于{{}}与ng-bind指令的问题,在此,分享下自己的知识点. 在脚本没有加载完成时,用户会看到{{}},界面比较丑陋.     一般的解决方法: 在index.html里面使用n ...

  5. kotlin string

    Kotlin String split 操作实践   内容 此文章展示kotlin中对String字符串的split操作,如果你有遇到这方面的需求,希望对你有用. 1. split + 正则 先看下系 ...

  6. CSS 美化radio checkbox

    CSS 样式 <style type="text/css"> .option-input { -webkit-appearance: none; -moz-appear ...

  7. git 使用说明

    git使用的一些说明 关于新用户1. 到优居客群里下载git客户端2. 安装之后打开git bash3. 生成密钥,执行如下命令:    ssh-keygen -t rsa -C "你的邮箱 ...

  8. lua keynote2

    [lua keynote2] 1.Lua函数可以返回多个结果值,比如string.find,其返回匹配串"开始和结束的下标"(如果不存在匹配串返回nil). > s, e = ...

  9. linus jsch文件下载

    package com.osplat.util;import java.io.File;import java.io.FileNotFoundException;import java.io.File ...

  10. EF CodeFirst学习笔记001--主键约定

    Code First 的核心是约定,这些默认的规则使我们可以用我们自己的类来创建模型.EF框架要求一个类必须有一个键属性.规则约定如果一个属性名为Id或者是类名+Id的形式(如PatientId),这 ...