限制UITextField和UITextView的中英文输入长度(中文占两个字符)
来源:互联网 发布:淘宝助理添加销售属性 编辑:程序博客网 时间:2024/05/22 07:03
首先,说一下UITextField的限制输入方法,要限制一个UITextField的输入字数,首先想到的应该是通过
UITextFieldDelegate
首先设置textField.delegate = self;
然后实现以下代理方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (textField.text.length > 20) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"最多可输入10个字" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; [alert show]; return NO; } return YES;}
这是最简单的限制方法,然而还有好多蛋疼的问题需要考虑,比如,中文占两个字符,非中文占一个字符的问题。当你想输入最后一个字的时候,你会发现拼音刚输入两个字母(字还没拼出来)就会显示长度超出。还有使用中文输入法的时候,有词汇联功能,那样这个代理方法是监控不到的。
首先解决第一个中英文占位不同的问题。这时候需要获取输入内容中中文的个数,出现一个中文就把长度加一。
接下来处理最后一个字拼写不了的问题,我们知道,在使用中文输入的时,拼写拼音的时候,输入框里面的拼音是处于高亮状态的。我们现在就利用这一特点来解决最后一个字的拼写问题,当输入框内容是高亮是先不做长度判断。
最后,联想输入情况下,此代理失效的问题。这个时候我们需要给textField添加一个事件,当textField发生编辑时调用
[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
在这个事件中做与上面代理方法中相同的处理即可。
完整代码如下:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)rangereplacementString:(NSString *)string { NSString * toBeString = [textField.text stringByReplacingCharactersInRange:range withString:string];//得到输入框的内容 NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage];//键盘输入模式 if ([lang isEqualToString:@"zh-Hans"]) {//简体中文输入模式,包括简体拼音,五笔,手写 UITextRange *selectedRange = [textField markedTextRange]; //获取高亮部分 UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0]; if (!position) {//如果没有高亮,判断字数是否超限 NSUInteger charLen = [self lengthWithString:toBeString]; if (charLen > 20) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"最多可输入10个字" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; return NO; } } else {//有高亮状态,暂不处理 } } else {//不是中文输入模式 NSUInteger charLen = [self lengthWithString:toBeString]; if (charLen > 20) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"最多可输入10个字" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; [alert show]; return NO; } } return YES;}- (void)textFieldDidChange:(UITextField *)textField { NSString * toBeString = [textField.text stringByReplacingCharactersInRange:range withString:string];//得到输入框的内容 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 (charLen > 20) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"最多可输入10个字" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; [alert show]; return NO; } } else {//有高亮状态,暂不处理 } } else { NSUInteger charLen = [self lengthWithString:toBeString]; if (charLen > 20) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"最多可输入10个字" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; [alert show]; return NO; } } return YES;}- (NSUInteger)lengthWithString:(NSString *)string { NSUInteger len = string.length; NSString *pattern = @"[\u4e00-\u9fa5]"; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:nil]; //计算中文字符个数 numMatch = [regex numberOfMatchesInString:string options:NSMatchingReportProgress return len + numMatch;}
最后来说一下textView的处理方法。这个就比较简单了,因为textView有这个代理方法- (void)textViewDidChange:(UITextView *)textView
,这样就不用考虑联想输入的问题了。代码如下
- (void)textViewDidChange:(UITextView *)textView {NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage];//键盘输入模式 if ([lang isEqualToString:@"zh-Hans"]) {//简体中文输入模式,包括简体拼音,五笔,手写 UITextRange *selectedRange = [textView markedTextRange]; //获取高亮部分 UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0]; if (!position) {//如果有高亮,判断字数是否超限 NSUInteger charLen = [self lengthWithString:textView.text]; if (charLen > 20) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"最多可输入10个字" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; [alert show]; return NO; } } else {//无高亮状态,不处理 } } else {//非中文输入模式 NSUInteger charLen = [self lengthWithString:textView.text]; if (charLen > 20) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"最多可输入10个字" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; return NO; } } return YES;}- (NSUInteger)lengthWithString:(NSString *)string { NSUInteger len = string.length; NSString *pattern = @"[\u4e00-\u9fa5]"; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:nil]; //计算中文字符个数 numMatch = [regex numberOfMatchesInString:string options:NSMatchingReportProgress range:NSMakeRange(0, len)]; return len + numMatch;}
本人才疏学浅,如有不对的地方,欢迎大家提出,共同学习。
1 0
- 限制UITextField和UITextView的中英文输入长度(中文占两个字符)
- UITextField ,UITextView 输入长度的限制
- UITextField限制输入的长度,UITextView限制输入的长度
- UITextField限制中文输入下的字符长度
- UITextField中文输入法输入时对字符长度的限制
- UITextView & UITextField 实现中英文混合输入的限制
- UITextField基本概念&&限制字符的输入长度(包括中文字符)
- 限制 UITextField 输入的字符长度
- iOS UITextField 限制输入长度,中英文混排,汉字占2个长度,英文数字占1个长度
- UITextView限制最大输入长度(UITextField相同)
- UITextView限制最大输入长度(UITextField相同)
- UITextView限制最大输入长度(UITextField相同)
- [iOS]UITextField和UITextView限制输入字符数量方面
- UITextField对中英文混合输入的长度限制
- UITextField, UITextView长度限制
- UITextField输入字符限制,中英文混排
- iOS:UITextField中文输入法输入时对字符长度的限制
- iOS:UITextField中文输入法输入时对字符长度的限制
- http缓存机制探索和疑问
- 阿里、百度、搜狐等公司社招面试记录与总结
- 德州仪器MSP430汇编工具手册翻译(暂不成熟,谨慎参考)【1】
- android开发日记(二)
- 举例讲解Go语言中函数的闭包使用
- 限制UITextField和UITextView的中英文输入长度(中文占两个字符)
- 音频重采样的基本(我的学习笔记)
- Android屏幕图片资源大小
- easyUI中选择下拉菜单和输入框的使用
- tensorboard 使用报错
- 安卓在任何界面弹出对话框
- bitmap引起的内存溢出OutOfMemory解决方案
- MySql 中blob 类型乱码的转换
- JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解