iOS中textField限制字符串长度、字符数的方法

前言

最近在开发的时候遇到一个问题,就是需要限制TextField中输入的字符串的长度,但是不是直接根据长度限制,而是根据字符数限制,一个汉字为两个字节,数字字母为一个字符。超过字符限制则不允许继续输入并弹出toast提示。

这个问题有三个关键点:判断字符串是否超出长度,超出长度不可输入,判断字符串的字符数。

下面话不多说了,来一起看看详细的介绍吧

方法如下:

1、判断字符串是否超出长度

[self.txfUsername addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
 - (void)textFieldDidChange:(id)sender
{
 if (self.textField.text.length > MAXLENGTH) // MAXLENGTH为最大字数
 {
 //超出限制字数时所要做的事
 }
}

为什么在这里要自己监听textField中文字的变化,而不直接使用textField的代理方法-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

因为这个方法在中文书输入法下,只能输入一个词的情况,如果联想词是两个词,也可以输入。所以会出现误差。直接监听UIControlEventEditingChanged 是最靠谱的。

2、超出长度不可输入

if (self.textField.text.length > MAXLENGTH) // MAXLENGTH为最大字数
 {
 self.textField.text = [self.txfUsername.text substringToIndex: MAXLENGTH]; // MAXLENGTH为最大字数
 }

如果超出长度,永远把前MAXLENGTH的子字符串赋给textField的text,即textField永远只显示前MAXLENGTH个字,视觉效果就是无法继续输入。

3、前面所有用到的MAXLENGTH均为字符串长度,不论数字字母还是汉字,最后要解决的问题就是判断字符数。

//按照中文两个字符,英文数字一个字符计算字符数
-(NSUInteger) unicodeLengthOfString: (NSString *) text {
 NSUInteger asciiLength = 0;
 for (NSUInteger i = 0; i < text.length; i++) {
 unichar uc = [text characterAtIndex: i];
 asciiLength += isascii(uc) ? 1 : 2;
 }
 return asciiLength;
}

NSUInteger lenOfBytes = [text lengthOfBytesUsingEncoding:NSUTF8StringEncoding];也试过,lengthOfBytesUsingEncoding就是按照编码返回字节数,但是NSUTF8StringEncoding是按照英文一个字符,中文三个字符来编码的,NSUnicodeStringEncoding是按照英文数字汉字都是两个字符编码的,目前iOS中的编码方法都和需求不符,所以需要另外做计算。

因为自己对字符编码不了解,所以没有想到正确的办法。这个方法是在网上找了好久才找到。来源ymonke。但是在使用过程中发现返回值有问题,于是做了修改,结果如上代码。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • IOS textField限制字节长度

    OC语言中,NSString类型的字符串,视英文字母和汉字都为一个长度(string.length把一个汉字也当做一个长度),而实际上,一个英文字母只占用1个字节,一个汉字占用2个字节. 有时又有需求,需要限定字节数目,而不是内容个数,就需要通过一些方法获取到字符串的字节数.比如,限定10个字节,则最多可以输入10个英文字母,或者5个汉字. 监听textField的长度变化,就需要设置textField的代理. 但是有个bug,监听内容变化的代理方法 - (BOOL)textField:(UIT

  • iOS UITextField最大字符数和字节数的限制详解

    前言 这里我给大家几组测试用例可以一试,为啥不好用. 1.限制10个字节,输入2个Emoj之后是8个字节(一个Emoj是4个字节),此时再输入一个中文,看看结果如何(中文的UTF8占3个字节) 2.限制5个字符,一个Emoj是2个字符,其他都是一个.此时输入两个Emoj,再输入中文,然后中文联想试试. 就目前的情况来说,看了很多资料,并没有一个通用的能限制字符数和字节数的封装.这里全面进行了总结,并进行了封装.欢迎大家下载. 一. 字符限制 1. 错误方法 常见的这种方法是错误的,会导致Emoj

  • 解决iOS7上UITextField限制字数输入导致崩溃问题的方法

    在一些场景中,需要限制用户的输入字数,例如在textField里进行控制(textView也类似,崩溃原因也相同),如图所示 系统会监听文本输入,需要注意的第一点是输入法处于联想输入还未确定提交的时候,对于第三方输入法例如搜狗,联想状态下的输入,是监听不到,除非点击确定输入到textField,才会触发changed事件. 但对于系统键盘,联想状态下的输入也会监听,这里如果不处理就容易发生崩溃,例如当快要达到字数限制时,继续输入,此时textField.text =联想输入文字+textFiel

  • IOS 开发之 UITextField限制字数的方法

    IOS 开发之 UITextField限制字数的方法 在输入东西的时候,如果想限制最大字数,可以用下面方法: 实例代码: - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; { if ([string isEqualToString:@"\n"]) { return YES; } NSSt

  • IOS中UITextView或UITextField字数限制的实现

    IOS中UITextView或UITextField字数限制的实现 UITextView或UITextField字数限制,输入时的限制,复制粘贴时的限制 字数限制有三种方法 在代理方法 "- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string" 或 "- (BOOL)textView:

  • iOS UITextField、UITextView只限输入中文、英文、数字及实时限制字符个数的封装实现代码

    引言需求:(输入框限制输入多少字符) 1.一个字母.符号.数字相当于一个字符 2.一个汉字相当于两个字符 3.不能输入特殊字符 4.不能输入emoji表情 直接上代码 一.注册通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldChange:) name:UITextFieldTextDidChangeNotification object:nil]; [[NSNotifica

  • 仅几行iOS代码限制TextField输入长度

    网上有很多限制textField输入长度方法,但是我觉得都不是很完美,准确来说可以说是不符合实际开发的要求,因此在这里整理一下textField限制输入长度的方法. 我所采用的并不是监听方法而是最不同的代理实现方法,为什么不使用监听呢???  当你看到这篇文章很有可能视是为一件事所苦恼那就是使用监听限制输入长度后不能够完美的控制输入内容.  举一个简单的例子:  你要限制输入长度为30个字符,当你输入30个字符后监听的确可以很好的控制不让你继续输入,但是问题也随之而来,当你把光标移动到输入内容中

  • iOS中textField限制字符串长度、字符数的方法

    前言 最近在开发的时候遇到一个问题,就是需要限制TextField中输入的字符串的长度,但是不是直接根据长度限制,而是根据字符数限制,一个汉字为两个字节,数字字母为一个字符.超过字符限制则不允许继续输入并弹出toast提示. 这个问题有三个关键点:判断字符串是否超出长度,超出长度不可输入,判断字符串的字符数. 下面话不多说了,来一起看看详细的介绍吧 方法如下: 1.判断字符串是否超出长度 [self.txfUsername addTarget:self action:@selector(text

  • PHP针对中英文混合字符串长度判断及截取方法示例

    本文实例讲述了PHP针对中英文混合字符串长度判断及截取方法.分享给大家供大家参考,具体如下: /** * * 中英混合字符串长度判断 * @param unknown_type $str * @param unknown_type $charset */ function strLength($str, $charset = 'utf-8') { if ($charset == 'utf-8') $str = iconv ( 'utf-8', 'gb2312', $str ); $num = s

  • IOS中Json解析实例方法详解(四种方法)

    作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此"http://www.bejson.com/"网站来进行JSON格式化校验(点击打开链接).此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便. 从IOS5开始,APPLE提供了对json的原生支持(NSJSONSerialization),但是为了兼容以前的iOS版本,可以使用第三方库来解析Json. 本文将介绍Tou

  • 在iOS中使用OpenGL ES实现绘画板的方法

    今天我们使用 OpenGL ES 来实现一个绘画板,主要介绍在 OpenGL ES 中绘制平滑曲线的实现方案. 首先看一下最终效果: 在 iOS 中,有很多种方式可以实现一个绘画板,比如我的另外一个项目 MFPaintView 就是基于 CoreGraphics 实现的. 然而,使用 OpenGL ES 来实现可以获得更多的灵活性,比如我们可以自定义笔触的形状,这是其他实现方式做不到的. 我们知道,OpenGL ES 中只有 点.直线.三角形 这三种图元.因此, 怎么在 OpenGL ES 中绘

  • iOS中从网络获取数据的几种方法的比较

    IOS中获取网络数据一般有三种:1.NSURLCondition(已过时) 2.NSURLSession  3.三方库AFNetWorking NSURLSession 是苹果对NSULRCondition的替代品,NSURLSession比NSURLCondition多了 1.可配置的数据信息NSURLSessionConfiguration,NSURLSessionConfiguration使你可以设置你要请求的数据,通常的设置如缓存,也可以使用默认的配置信息defaultCongurati

  • iOS中的地理位置的获取及plist设置方法

    1.在前台的时候获取地理位置信息 ios 8/9 在info.plist中配置NSLocationWhenInUseUsageDescription的值,否则上面的方法无效 调用.requestWhenInUseAuthorization()获取前台获取地理位置权限 调用.startUpdatingLocation() 代码示例 class ViewController: UIViewController { lazy var locateM : CLLocationManager = { le

  • Shell脚本中计算字符串长度的5种方法

    有时在Linux操作系统中需要计算某个字符串的长度,通过查询资料整理了下目前Shell中获取字符串的长度的多种方法,在这里分享给大家,方法如下: 方法1: 使用wc -L命令 wc -L可以获取到当前行的长度,因此对于单独行的字符串可以用这个简单的方法获取,另外wc -l则是获取当前字符串内容的行数. 复制代码 代码如下: echo "abc" |wc -L 方法2: expr length string 使用expr length可以获取string的长度 方法3: awk获取域的个

  • Lua中获取utf8字符串长度的方法和自定义函数

    复制代码 代码如下: --- 获取utf8编码字符串正确长度的方法 -- @param str -- @return number function utfstrlen(str) local len = #str; local left = len; local cnt = 0; local arr={0,0xc0,0xe0,0xf0,0xf8,0xfc}; while left ~= 0 do local tmp=string.byte(str,-left); local i=#arr; wh

  • PHP获取中英混合字符串长度的方法

    今晚在写框架的表单验证类时,需要判断某个字符串长度是否在指定区间内,很自然地,想到了PHP中的strlen函数. 复制代码 代码如下: $str = 'Hello world!';echo strlen($str); // 输出12 然而在PHP自带的函数中,strlen及mb_strlen都是通过计算字符串所占字节数来计算长度的,在不同的编码情况下,中文所占的字节数是不同的.在GBK/GB2312下,中文字符占2个字节,而在UTF-8下,中文字符占3个字节. 复制代码 代码如下: $str =

  • php中计算中文字符串长度、截取中文字符串的函数代码

    在PHP中,我们都知道有专门的mb_substr和mb_strlen函数,可以对中文进行截取和计算长度,但是,由于这些函数并非PHP的核心函数,所以,它们常常有可能没有开启.当然,如果是用的自己的服务器,则只要在php.ini中开启即可.如果是用的虚拟主机,而服务器又没有开启这方面的函数的话,那就需要我们自己写出点适合咱国情的函数来了. 以下几个函数用起来颇为顺手的.不过要知道,得在utf-8环境下使用. 复制代码 代码如下: header('Content-type:text/html;cha

随机推荐