初学者笔记:
为了防止其他初学者跟我一下,一边学一边谷歌,百度的同学们,少走弯路。对于限制输入个数,这个方法是网上暂时没有的思想,自己想出来。之前2天前写过,单误操作给删除了。如有帮助请仔细看看,自认为挺好的。。。。。
比较:UITextView以及UITextField的限制方法都是一样的。不一样的是
UITextView的代理方法中直接有:
//内容发生改变编辑
- (void)textViewDidChange:(UITextView*)textView;
然而UITextField没有,但是UITextField的代理方法最下面有这样一段:
UIKIT_EXTERNNSString* const UITextFieldTextDidChangeNotification;
当时,我看到这个感觉跟上面的差不多,都是模式是TextDidChange。
查了一下Notification的意思,通知,所及简而言之:
[NSNotificationCenter defaultCenter]中添加对于UITextField的通知事件
所以,这两个控件都是相同的,我就拿UITextView举例。开始步入正轨。。。。。
分析:
//内容将要发生改变的时候会走的函数 其中的text是变化的值
- (BOOL)textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range
replacementText:(NSString*)text;
函数的返回值 YES 以及 NO;YES是允许修改textview的值, NO是不允许修改textview的值
//内容发生改变的时候会走的函数
- (void)textViewDidChange:(UITextView*)textView;
我们会用到这两个函数,知道大概的什么时候会调用,那么就来分析一下都有什么情况。
按照原始的认知:英文占一个字符,中文占两个字符。
情况一:
1)全部英文 2)全部中文 3)英文以及中文的结合
情况二:
因为刚接触ios也就有认识来一样东西,叫做表情,类似😄这样的东西。所以就会出现英文以及中文的结合,加上表情。
NSData*data = [textView.text dataUsingEncoding:NSNonLossyASCIIStringEncoding];
NSString*goodValue =[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"gv = %@,len = %lu",goodValue,(unsignedlong)goodValue.length);
data = [goodValue dataUsingEncoding:NSUTF8StringEncoding];
goodValue = [[NSString alloc]initWithData:data encoding:NSNonLossyASCIIStringEncoding];
NSLog(@"gv = %@,len = %lu",goodValue,(unsignedlong)goodValue.length);
表情-截图
这样可以看出来占用的是12字符,同样的处理汉字。
汉字-截图
英文就不用说了,就是占用1。
分析到这,当用户输入的时候都会有什么情况,1)手动输入 2)复制粘贴 3)自动输入(自动输入:就是中文中的拼音联想)
因为全是英文的情况好理解,所以先从中英文一起开写。
总体分析:
1.当输入拼音的情况下,会有高亮(拼音出现),会走shouldChangeTextInRange,所以要判断是不是拼音,还是正常的输入。
提供的方法如下:
判断高亮的方法-截图
图解:这两个值如果不是nil是高亮状态,但是有两种状态:第一种,将要进入高亮状态,但是没进入,第一次点中文输入法的按键两个值时nil。第二种,是直接点击拼音联想的文字,以及输入表情符号😊的时候,两个值是nil。
是判断是否有高亮的出现,点击输入文字的时候是不走shouldChangeTextInRange这个函数的。而是走textViewDidChange。
所以在textViewDidChange判断字符串的长度,以及_及时的修改字符串的长度,
我的做法是:
判断长度以及修改字符串-截图
图解:判断了selectRange以及pos的值是否为nil,上文说过这是区分高亮的,在else中的贩判断中的if语句中JudgementString的函数中时判断输入的字符串是否超过限定的字符,如果没超过,直接return不管它。让他随便的添加。如果超了,那就截取字符串。
2.核心内容:
在上面的1种最后是判断是否超过限制字符。因为有英文,中文,表情的存在,所以判断会有3个分支如图:
核心判断模块-截图
图解:首先是判断是否中文,当这样判断遇到表情的时候,会遇到Cstring=NULL的情况,所以知识需要单独拿出来判断。又因为表情最少时一个以及两个中文字符大小,所以是需要重新改变Range的。因此,分别的以英文,中文表情判断,必须是在加上增加量再与MAX判断,返还刚要超过临界点的上一个值的位置,到时候是需要截取字符串的,如果不记录上一个,那么,就可能出现截取半个表情,出现半A的情况,删除会出现问题。
本文的两个情况 理解:
1)高亮但是没输入上去
2)输入上TextView上 在这两方面做判断
网友评论
这里有个第三方,也是把高亮选中的字符串从限制计数里剔除,达到限制输入又不限制联想的效果,可以参考下。