iOS开发进阶篇iOS键盘

iOS之UITextView和UITextField的字数限制

2016-08-03  本文已影响2296人  黑色桃芯

应用场景:
UITextField:比如姓名,公司,职位等,这些一般一行
UITextView:比如,个人爱好,个人简介等,多行

一般上面的这些的内容,都会需要限制字数,比如姓名5个字,个人简介100个字等。下面说说我遇到的问题和解决:

UITextField:

一般限制字数很好弄,但是中文拼音的联想,即使你限制最大字数,中文联想还是能继续打字,通过查阅,代码如下:
注册通知:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFiledEditChanged:) name:@"UITextFieldTextDidChangeNotification" object:self.infoTextField];

实现方法:

- (void)textFiledEditChanged:(NSNotification *)obj
{
UITextField *textField = (UITextField *)obj.object;
NSString *toBeString = textField.text;
NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage]; // 键盘输入模式
if ([lang isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写
    UITextRange *selectedRange = [textField markedTextRange];       //获取高亮部分
    UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
    // 没有高亮选择的字,则对已输入的文字进行字数统计和限制
    if (!position) {
        if (toBeString.length >= 7) {
            textField.text = [toBeString substringToIndex:7];
        }
    }       // 有高亮选择的字符串,则暂不对文字进行统计和限制
    else{
    }
}   // 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
else{
    if (toBeString.length >= 7) {
        textField.text = [toBeString substringToIndex:7];
    }
}
}

UITextView

屏幕快照 2016-08-03 上午10.03.19.png 屏幕快照 2016-08-03 上午10.41.01.png

这样写完看似没什么问题,UITextView不用控制中文联想,到了字数限制就不能继续显示,但是测试发现,当粘贴过来的文字大于最大限制字数就会crash
查阅资料,修改shouldChangeTextInRange的代码,textViewDidChange代码不变
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
NSString *str = [NSString stringWithFormat:@"%@%@", textView.text, text];

  if (str.length > LimitMaxWord)
   {
      NSRange rangeIndex = [str rangeOfComposedCharacterSequenceAtIndex:200];

      if (rangeIndex.length == 1)//字数超限
      {
          textView.text = [str substringToIndex:200];
    //这里重新统计下字数,字数超限,我发现就不走textViewDidChange方法了,你若不统计字数,忽略这行
          self.wordLable.text = [NSString stringWithFormat:@"%lu/%d", (unsigned long)textView.text.length, 200];
      }else{
          NSRange rangeRange = [str rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, 200)];
          textView.text = [str substringWithRange:rangeRange];
      }
       return NO;
   }
   return YES;
  }

搞定了,粘贴文字崩溃就解决了,也做到了字数的限制。

上一篇下一篇

猜你喜欢

热点阅读