iOS UITextField输入限制(中英文混合)

我们可以利用此函数和对应的枚举UIControlEventEditingChanged来监测输入的内容变化,从而控制输入的字数

 - (void)textFiledDidChange:(UITextField *)textField
   {
      if (kMaxNumber == 0) return;
      NSString *toBeString = textField.text;

      NSLog(@" 打印信息toBeString:%@",toBeString);

      NSString *lang = [[textField textInputMode] primaryLanguage]; // 键盘输入模式
      if ([lang isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写

      //判断markedTextRange是不是为Nil,如果为Nil的话就说明你现在没有未选中的字符,
      //可以计算文字长度。否则此时计算出来的字符长度可能不正确

      UITextRange *selectedRange = [textField markedTextRange];
      //获取高亮部分(感觉输入中文的时候才有)
      UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
    // 没有高亮选择的字,则对已输入的文字进行字数统计和限制
      if (!position)
      {
        //中文和字符一起检测  中文是两个字符
        if ([toBeString getStringLenthOfBytes] > kMaxNumber)
        {
            textField.text = [toBeString subBytesOfstringToIndex:kMaxNumber];

        }
    }
}
else
{
    if ([toBeString getStringLenthOfBytes] > kMaxNumber)
    {
        textField.text = [toBeString subBytesOfstringToIndex:kMaxNumber];
    }
}
}

其中有正则表达式的验证,方法我是写在NSString的扩展中的,具体如下

//.h文件
#import <Foundation/Foundation.h>

 @interface NSString (category)

- (NSInteger)getStringLenthOfBytes;

- (NSString *)subBytesOfstringToIndex:(NSInteger)index;

@end


//.m文件

#import "NSString+category.h"

 @implementation NSString (category)

 - (NSInteger)getStringLenthOfBytes
 {
NSInteger length = 0;
for (int i = 0; i<[self length]; i++) {
    //截取字符串中的每一个字符
    NSString *s = [self substringWithRange:NSMakeRange(i, 1)];
    if ([self validateChineseChar:s]) {

        NSLog(@" s 打印信息:%@",s);

        length +=2;
    }else{
        length +=1;
    }

    NSLog(@" 打印信息:%@  %ld",s,(long)length);
}
return length;
 }

 - (NSString *)subBytesOfstringToIndex:(NSInteger)index
{
NSInteger length = 0;

NSInteger chineseNum = 0;
NSInteger zifuNum = 0;

for (int i = 0; i<[self length]; i++) {
    //截取字符串中的每一个字符
    NSString *s = [self substringWithRange:NSMakeRange(i, 1)];
    if ([self validateChineseChar:s])
    {
        if (length + 2 > index)
        {
            return [self substringToIndex:chineseNum + zifuNum];
        }

        length +=2;

        chineseNum +=1;
    }
    else
    {
        if (length +1 >index)
        {
            return [self substringToIndex:chineseNum + zifuNum];
        }
        length+=1;

        zifuNum +=1;
    }
}
return [self substringToIndex:index];
}

  //检测中文或者中文符号
 - (BOOL)validateChineseChar:(NSString *)string
 {
NSString *nameRegEx = @"[\\u0391-\\uFFE5]";
if (![string isMatchesRegularExp:nameRegEx]) {
    return NO;
}
return YES;
}

//检测中文
- (BOOL)validateChinese:(NSString*)string
  {
NSString *nameRegEx = @"[\u4e00-\u9fa5]";
if (![string isMatchesRegularExp:nameRegEx]) {
    return NO;
}
return YES;
  }

 - (BOOL)isMatchesRegularExp:(NSString *)regex {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return [predicate evaluateWithObject:self];
}


@end

当然,如果遇到UITextView限制字数的时候,由于不是继承1所以没有addtarget方法,但是可以通过添加通知UITextViewTextDidChangeNotification的方法来监测 ,方法还是和上面一样。

推荐阅读更多精彩内容