zoukankan      html  css  js  c++  java
  • UITextView输入中文时限制字数

    最近因为项目中输入用户简称时限制长度,被测试部多次提交问题,最终将解决方法分享给大家。

    刚开始用最简单的方法,在textView的代理方法里面做处理

     1 - (void)textViewDidChange:(UITextView *)textView
     2 {
     3     textCountlabel.text = [NSString stringWithFormat:@"%lu", (unsigned long)30 - textView.text.length];
     4 }
     5 
     6 
     7 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
     8 {
     9     if ([text isEqualToString:@"
    "])
    10     {
    11         [textView resignFirstResponder];
    12         return NO;
    13     }
    14 
    15     if (range.location > 30)
    16     {
    17         return  NO;
    18     }
    19     else
    20     {
    21         return YES;
    22     }
    23 }

    这种情况下需要正好输入限定的长度时才好使,一次性拼音拼出来的字超过固定长度时textView的内容保持不变。

    后来又修改成超过限定长度时直接从前到后取需要长度,代码如下:

     1 - (void)textViewDidChange:(UITextView *)textView
     2 {
     3     if (textView.text.length > 30)
     4     {
     5         textView.text = [textView.text substringToIndex:30];
     6         
     7         [[[UIAlertView alloc] initWithTitle:@"提示" message:@"限定长度为30" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles: nil] show];
     8     }
     9     textCountlabel.text = [NSString stringWithFormat:@"%lu", (unsigned long)30 - textView.text.length];
    10 }
    11 
    12 
    13 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
    14 {
    15     if ([text isEqualToString:@"
    "])
    16     {
    17         [textView resignFirstResponder];
    18         return NO;
    19     }
    20     return YES;
    21 }

    修改完后自己亲测通过,万万没想到测试部又提交上来了。问题内容大概是剩余两个字的时候拼音拼到一半(实际是输入两个字母)就提示了。根据问题又找到了原因:自己用第三方输入法,输入汉字时直接拼音不会到textView里面,测试部用的是手机系统输入法,拼的时候拼音直接就是textView的内容,这样就导致剩余两个字想输入“测试”,结果到“ces”的时候就提示了,找到原因就可以解决问题了,直接上代码:

     1 #define MAXSTRINGLENGTH 15    //限定输入长度
     2 
     3 
     4 - (void)textViewDidChange:(UITextView *)textView
     5 {
     6     NSString *lang = [[[UITextInputMode activeInputModes] firstObject] primaryLanguage];//当前的输入模式
     7     if ([lang isEqualToString:@"zh-Hans"])
     8     {
     9         UITextRange *range = [textView markedTextRange];
    10         UITextPosition *start = range.start;
    11         UITextPosition*end = range.end;
    12         NSInteger selectLength = [textView offsetFromPosition:start toPosition:end];
    13         NSInteger contentLength = textView.text.length - selectLength;
    14         
    15         if (contentLength > MAXSTRINGLENGTH)
    16         {
    17             textView.text = [textView.text substringToIndex:MAXSTRINGLENGTH];
    18             [[[UIAlertView alloc] initWithTitle:@"提示" message:@"最长限制15个字" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles: nil] show];
    19 20         }
    21         if (contentLength < MAXSTRINGLENGTH)
    22         {
    23             textCountlabel.text = [NSString stringWithFormat:@"还剩%ld个字", MAXSTRINGLENGTH - contentLength];
    24         }
    25         else
    26         {
    27             textCountlabel.text = @"还剩0个字";
    28         }
    29     }
    30     else
    31     {
    32         if (textView.text.length > MAXSTRINGLENGTH)
    33         {
    34             textView.text = [textView.text substringToIndex:MAXSTRINGLENGTH];
    35             [[[UIAlertView alloc] initWithTitle:@"提示" message:@"最长限制15个字" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles: nil] show];
    36             
    37 } 38 textCountlabel.text = [NSString stringWithFormat:@"还剩%ld个字", MAXSTRINGLENGTH-textView.text.length]; 39 } 40 } 41
  • 相关阅读:
    spring-boot 中application.properties的各种配置
    spring-boot 集合mybatis 的分页查询
    spring boot热部署pom.xml配置
    ssm框架整合
    mybatis逆向工程
    整合hibernate的lucene大数据模糊查询
    QBC查询、离线条件查询(DetachedCriteric)和分页查询模版
    虚拟机vmnet0、vmnet1和vmnet8的区别
    centOS7-配置网络地址
    在windows中使用Navicat连接Linux虚拟机中的mysql数据库
  • 原文地址:https://www.cnblogs.com/francisblogs/p/6797215.html
Copyright © 2011-2022 走看看