美文网首页iOS基础
UITextView/UItextField的限制输入文字个数

UITextView/UItextField的限制输入文字个数

作者: 莹bei___㤫 | 来源:发表于2015-08-14 17:57 被阅读3382次

    初学者笔记:


    为了防止其他初学者跟我一下,一边学一边谷歌,百度的同学们,少走弯路。对于限制输入个数,这个方法是网上暂时没有的思想,自己想出来。之前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上    在这两方面做判断

    相关文章

      网友评论

      • Mc小陈:楼主,能发下你的源码不?你这上面少个方法啊
        2bf5be27c4bd:@黑幕居士 https://github.com/tingxins/InputKit 这个只是简单的处理了类似于str.length的简单处理,以及高亮,没有处理emoji,中文。楼主的最后一张图是区分的
        黑幕居士:https://github.com/tingxins/InputKit
        这里有个第三方,也是把高亮选中的字符串从限制计数里剔除,达到限制输入又不限制联想的效果,可以参考下。
      • 风晚初晨:请问博主有对应的完整代码吗,急求!
        Mc小陈:@风晚初晨 我也想要。

      本文标题:UITextView/UItextField的限制输入文字个数

      本文链接:https://www.haomeiwen.com/subject/upkwqttx.html