中葡萄牙语混合,UITextField输入限制

先说说记录那么些的因由呢,关于限制UITextField的输入字数的种种必要,已经疲惫衰弱了,工作几年中用的还真十分的多,有只要字数长度的,也是有字符长度的,当然那一个就包蕴中文和法文,还恐怕有.....标点符号也分中文和斯洛伐克共和国(The Slovak Republic)语的,每回都多不情愿的写这么些地点,闲来无事,就来记录一下,方便我们,若有不法则的地方,多多指教哈。

先说说记录这一个的因由吗,关于限制UITextField的输入字数的各样需要,已经疲弱了,专业几年中用的还真相当多,有只要字数长度的,也可以有字符长度的,当然这一个就回顾汉语和阿拉伯语,还应该有.....标点符号也分粤语和葡萄牙共和国语的,每回都多不情愿的写那几个地方,闲来无事,就来记录一下,方便大家,若有畸形的地方,多多指教哈。关于UITextField我们鲜明对上面那些主意十三分熟知- (BOOL)textField:(UIText菲尔德 *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string那么这一个函数的大致意思是何等吧?小编是如此通晓的(个人感到)由于再次来到的是个 BOOL 所以小编估量大致便是大家在输入的时候,是不是对UITextField的内容举办更动上面来回顾深入分析下参数textField那一个参数大家都懂,正是响应该公约的UIText菲尔德对象range在那么些函数中,增多了打字与印刷音信,测试了下- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{        NSLog(@" 打字与印刷音讯:%lu  -----%lu ",(unsigned long)range.location,(unsigned long)range.length);}//打字与印刷log2017-01-25 17:48:49.826 TestObject[5502:683375]  打字与印刷新闻toBeString:Zxtgfd2017-01-25 17:48:50.506 TestObject[5502:683375]  打字与印刷新闻:6  -----0 2017-01-25 17:48:50.508 TestObject[5502:683375]  打字与印刷音讯toBeString:Zxtgfda2017-01-25 17:48:51.894 TestObject[5502:683375]  打字与印刷消息:6  -----1由此能够看出,在输入的时候,range.length为0,range.location为插入时的任务,range.length为1时,是作者在点击删除的时候打字与印刷的,应该能够象征删除(不明确)string string.length为0时,表示删除。限制输入长度1 假若只是输入希伯来语状态,可能数字状态,那么大家我们得以采纳这么些函数,完毕情势为:- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{        NSLog(@" 打字与印刷信息:%lu  -----%lu ",(unsigned long)range.location,(unsigned long)range.length);    if (textField.text.length + string.length > k马克斯Number) {        return NO;    }    //删除按钮    if (string.length == 0)    {        return YES;    }    return YES;}2 不过,若是要提到到普通话的话,那样就不行了。因为,在输入普通话的时候,固然您还一向不明确所输入的普通话,那么UITextField此时收下的并非华语,而是对应的拼音,比方您想输入汉字君不见沧澜江之水天上来 那么相应的拼音则是junbujianhuanghezhishuitianshanglai这么一来,比方您想限制的输入个数为10 那么只好输入到junbujianh这么些地方。那么大家该怎么解决难点吧,走入API大家能够发掘。UITextField: UIControl  ---- UITextField承接自UIControl有如下函数- (void)addTarget:(nullable id)target action:(SEL)action forControl伊夫nts:(UIControl伊芙nts)controlEvents;typedef NS_OPTIONS(NSUInteger, UIControlEvents) {    UIControlEventTouchDown                                        = 1 <<  0,      // on all touch downs    UIControlEventTouchDownRepeat                                  = 1 <<  1,      // on multiple touchdowns (tap count > 1)    UIControlEventTouchDragInside                                  = 1 <<  2,    UIControlEventTouchDragOutside                                  = 1 <<  3,    UIControlEventTouchDragEnter                                    = 1 <<  4,    UIControlEventTouchDragExit                                    = 1 <<  5,    UIControlEventTouchUpInside                                    = 1 <<  6,    UIControlEventTouchUpOutside                                    = 1 <<  7,    UIControlEventTouchCancel                                      = 1 <<  8,    UIControlEventValueChanged                                      = 1 << 12,    // sliders, etc.    UIControlEventPrimaryActionTriggered NS_ENUM_AVAILABLE_IOS(9_0) = 1 << 13,    // semantic action: for buttons, etc.    UIControl伊芙ntEditingDidBegin                                  = 1 << 16,    // UITextField    UIControlEventEditingChanged                                    = 1 << 17,    UIControl伊芙ntEditingDidEnd                                    = 1 << 18,    UIControl伊夫nt艾德itingDidEndOnExit                              = 1 << 19,    // 'return key' ending editing    UIControlEventAllTouchEvents                                    = 0x00000FFF,  // for touch events    UIControlEventAllEditing伊夫nts                                  = 0x000F0000,  // for UITextField    UIControl伊夫ntApplicationReserved                              = 0x0F000000,  // range available for application use    UIControlEventSystemReserved                                    = 0xF0000000,  // range reserved for internal framework use    UIControl伊芙ntAllEvents                                        = 0xFFFFFFFF};我们能够使用此函数和对应的枚举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@interface NSString (category)

关于UITextField

大家自然对上面那几个艺术十二分驾驭

- textField:(UITextField *)textField shouldChangeCharactersInRange:range replacementString:(NSString *)string

那正是说这些函数的光景意思是哪些吧?小编是如此掌握的由于返回的是个 BOOL 所以我猜想大概就是我们在输入的时候,是否对UITextField 的内容进行修改下边来总结深入分析下参数textField 那个参数大家都懂,正是响应该左券的UITextField对象``range在那么些函数中,增多了打字与印刷音讯,测验了下

- textField:(UITextField *)textField shouldChangeCharactersInRange:range replacementString:(NSString *)string{ NSLog(@" 打印信息:%lu -----%lu ",(unsigned long)range.location,(unsigned long)range.length);}//打印log2017-01-25 17:48:49.826 TestObject[5502:683375] 打印信息toBeString:Zxtgfd2017-01-25 17:48:50.506 TestObject[5502:683375] 打印信息:6 -----0 2017-01-25 17:48:50.508 TestObject[5502:683375] 打印信息toBeString:Zxtgfda2017-01-25 17:48:51.894 TestObject[5502:683375] 打印信息:6 -----1 

透过能够看来,在输入的时候,range.length为0,range.location为插入时的职分,range.length为1时,是自个儿在点击删除的时候打字与印刷的,应该能够象征删除string string.length为0时,表示删除。

- (NSInteger)getStringLenthOfBytes;

限定输入长度
  • 1 若是只是输入丹麦语状态,也许数字状态,那么大家大家得以应用那几个函数,实现格局为:
- textField:(UITextField *)textField shouldChangeCharactersInRange:range replacementString:(NSString *)string{ NSLog(@" 打印信息:%lu -----%lu ",(unsigned long)range.location,(unsigned long)range.length); if (textField.text.length + string.length > kMaxNumber) { return NO; } //删除按钮 if (string.length == 0) { return YES; } return YES;}
  • 2 不过,假如要涉及到普通话的话,那样就可怜了。因为,在输入粤语的时候,借令你还未有规定所输入的华语,那么UITextField那时候摄取的并非普通话,而是对应的拼音,比方您想输入汉字君不见黄河之水天上来 那么相应的拼音则是junbujianhuanghezhishuitianshanglai这么一来,比方你想限制的输入个数为10 那么只可以输入到junbujianh其壹位置。那么大家该怎么化解难点吧,踏向API我们得以窥见。UITextField : UIControl ---- UITextField继承自UIControl有如下函数
- addTarget:(nullable id)target action:action forControlEvents:(UIControlEvents)controlEvents;typedef NS_OPTIONS(NSUInteger, UIControlEvents) { UIControlEventTouchDown = 1 << 0, // on all touch downs UIControlEventTouchDownRepeat = 1 << 1, // on multiple touchdowns (tap count > 1) UIControlEventTouchDragInside = 1 << 2, UIControlEventTouchDragOutside = 1 << 3, UIControlEventTouchDragEnter = 1 << 4, UIControlEventTouchDragExit = 1 << 5, UIControlEventTouchUpInside = 1 << 6, UIControlEventTouchUpOutside = 1 << 7, UIControlEventTouchCancel = 1 << 8, UIControlEventValueChanged = 1 << 12, // sliders, etc. UIControlEventPrimaryActionTriggered NS_ENUM_AVAILABLE_IOS = 1 << 13, // semantic action: for buttons, etc. UIControlEventEditingDidBegin = 1 << 16, // UITextField UIControlEventEditingChanged = 1 << 17, UIControlEventEditingDidEnd = 1 << 18, UIControlEventEditingDidEndOnExit = 1 << 19, // 'return key' ending editing UIControlEventAllTouchEvents = 0x00000FFF, // for touch events UIControlEventAllEditingEvents = 0x000F0000, // for UITextField UIControlEventApplicationReserved = 0x0F000000, // range available for application use UIControlEventSystemReserved = 0xF0000000, // range reserved for internal framework use UIControlEventAllEvents = 0xFFFFFFFF};

咱俩得以采纳此函数和呼应的枚举UIControlEventEditingChanged来监测输入的开始和结果退换,进而决定输入的篇幅

代码如下

- 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 - (NSInteger)getStringLenthOfBytes;- (NSString *)subBytesOfstringToIndex:(NSInteger)index;@end//.m文件#import "NSString+category.h"@implementation NSString - (NSInteger)getStringLenthOfBytes{ NSInteger length = 0; for (int i = 0; i<[self length]; i++) { //截取字符串中的每一个字符 NSString *s = [self substringWithRange:NSMakeRange]; if ([self validateChineseChar:s]) { NSLog(@" s 打印信息:%@",s); length +=2; }else{ length +=1; } NSLog(@" 打印信息:%@ %ld",s,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]; 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];}//检测中文或者中文符号- validateChineseChar:(NSString *)string{ NSString *nameRegEx = @"[\u0391-\uFFE5]"; if (![string isMatchesRegularExp:nameRegEx]) { return NO; } return YES;}//检测中文- validateChinese:(NSString*)string{ NSString *nameRegEx = @"[u4e00-u9fa5]"; if (![string isMatchesRegularExp:nameRegEx]) { return NO; } return YES;}- isMatchesRegularExp:(NSString *)regex { NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; return [predicate evaluateWithObject:self];}@end

理当如此,即使赶过UITextView限定字数的时候,由于不是一连1于是并未有addtarget方式,不过足以经过丰盛文告UITextViewTextDidChangeNotification的法子来监测 ,方法或然和地点同样。

  • 总结针对地点三种差别的方案,在分歧的时候能够采取差异的方案。希望对大家有赞助,有啥狼狈的地点,还望不吝赐教。

- (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

本文由华夏彩票发布于编程应用,转载请注明出处:中葡萄牙语混合,UITextField输入限制

您可能还会对下面的文章感兴趣: