如何更好地限制一个UITextField的输入长度

要限制一个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.length > 20) 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 (string.length == 0) return YES;

        NSInteger existedLength = textField.text.length;
        NSInteger selectedLength = range.length;
        NSInteger replaceLength = string.length;
        if (existedLength - selectedLength + replaceLength > 20) {
            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.text.length > 20) {
            textField.text = [textField.text substringToIndex:20];
        }
    }
}

来源:http://blog.csdn.net/jasonblog/article/details/23771117

时间: 2024-08-03 20:39:47

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

如何限制一个UITextField的输入长度

给UITextField增加监听 [textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; 实现监听方法 - (void)textFieldDidChange:(UITextField *)textField { if (textField == self.titleField) { if (textField.text.lengt

UITextField限制输入长度

首先,汉字的输入时的联想词在输入到TextFiled时,并不会走 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; 这导致了在这里进行长度限制的代码都会失效.此路不通. 因此我们可以用注册UITextFieldTextDidChangeNotification通知来监测TextField的文字的变

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

在ios开发过程中,我们有时候需要对UITextField的输入长度进行控制,比如输入手机号码最大长度为11位等,而ios自身又不像android那样可以设置输入框的输入长度,接下来通过简单几步实现这个功能: 1.新建一个类继续UITextField比如这个类叫MyUITextField 2.声明一个变量用来记录输入的最大长度 3.添加一个事件用于监听输入框输入值的变化 4.通过判断当前text字符串的长度是否大于最大长度来截取字符串并赋值給当前text保证text字符串的值始为指指定的最大长度

如何更好地开发一个Android应用

作为一名android开发工程师(http://www.maiziedu.com/course/android-px/),脑海中经常在想一个问题,如何更好地开发一个android应用?这个问题不仅是android开发工程师,比如总监.CEO等等都在想这样一个问题.面向开发者,开发主管,总监,CEO等.更好地开发一个android应用主要做到三个大点,就足矣. 项目定义 不同类型的项目当以不同的处理方式. 1. 项目型 该类型项目,重点在于完成项目,取决于客户需求,或难或易,开发者能做的就是深入挖

限制 UITextField 输入长度

限制 UITextField 输入长度 标签(空格分隔): UITextField UITextField 是 iOS 中最常用的组件之一.关于它也有各种各样的需求,这些需求是它本身没有提供相应的API的.限制输入框文本长度是常见的需求,UITextField 本身也并没有为此提供API.本文尝试给其加入这个功能. 1.通过 delegate 来实现 限制 UITextField 的输入字数,首先想到的是 UITextFieldDelegate,通过实现这个协议来实现需求: - (BOOL)te

产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复

写在前面 前天去面试了,给出的笔试中有这样的一道算法题,产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复 当时,脑子一热,也没想那么多,就用集合实现了一下,经面试官提醒,发现还有更好的方式来实现. 代码 首先看一下这样一段代码 1 namespace Wolfy.RandomDemo 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 List<int> lst = new List<i

UITextField限制输入中文字数

前面写一了篇,UITextField Category来限制输入的字数,是有个Bug的,要输入中文时会crash.现在修改 了下,代码如下 .h文件 #import <UIKit/UIKit.h> @interface UITextField (LimitLength) /** * 使用时只要调用此方法,加上一个长度(int),就可以实现了字数限制,汉字不可以 * * @param length */ - (void)limitTextLength:(int)length; /** * uit

【二】在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数。 ```java public class Test { /** 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数. public class Test { /** 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数. */ public static void main(String[] args) { int[][] arr =

求一个字符串的字节长度

编写一个方法 求一个字符串的字节长度 假设:一个英文字符占用一个字节,一个中文字符占用两个字节 function GetBytes(str){ var len = str.length; var bytes = len; for(var i=0; i<len; i++){ if (str.charCodeAt(i) > 255) bytes++; } return bytes; } alert(GetBytes("你好,as"));