这两天遇到一个需求:在UITextField中限定指定字长(这里的字长是字符串的实际长度而不是字符的个数),中英文是混合输入方式。在iOS上一般中文字符占两位英文占一位,网上找了很多代码都只是提供计算中英文字长的方法,达不到我的需求。经过一番思考做出了一个解决思路。
UITextField实现输入响应方法:
UITextFieldDelegate中没有实现类似UITextViewDelegate中 - (void)textViewDidChange:
的委托函数,这里我们有两种解决方案:
方案一:
UITextField中事实上是有注册 UITextFieldTextDidChangeNotification
的通知的,所以我们可以通过注册这一个通知函数的回调函数去实现。(但是这样我们还需要去移除监听)
[[NSNotificationCenter defaultCenter]addObserver:self
selector:@selector(textFiledEditChanged:)
name:@"UITextFieldTextDidChangeNotification"
object:_personNameText];
方案二:
UITextField是继承自UIControl,而UIControl.h文件中有定义到这个函数:
- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
UIControlEventsz中就有包含一个项叫 UIControlEventEditingChanged
,所以我们据此就可以这样为UITextField注册输入改变回调:
[_personNameText addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
获取textField中的text字符串长度
方案一:
- (NSInteger)getStringLength:(NSString*)inputStr
{
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSData* da = [inputStr dataUsingEncoding:enc];
NSLog(@"-----the string length is %d------",[da length]);
return [da length];
}
方案二:
- (NSInteger)getStringLength:(NSString*)inputStr
{
NSInteger strlength = 0;
char* p = (char*)[inputStr cStringUsingEncoding:NSUnicodeStringEncoding];
for (NSInteger i=0 ; i<[inputStr lengthOfBytesUsingEncoding:NSUnicodeStringEncoding] ;i++) {
if (*p) {
p++;
strlength++;
}
else {
p++;
}
}
return strlength;
}
指定字符串长截取textField输入框内字符串
先放上代码再来解释下:
- (void)setTextFieldText: (UITextField *)textField {
NSInteger count = 0;// Chinese Character Count
NSInteger len = textField.text.length;
for (NSInteger i=0; i<len; i++){
// 如果遍历到长度MaxInputLength时退出遍历
if ([self getStringLength:[textField.text substringToIndex:i]] >= MaxInputLength) {
break;
}
NSString *tmp = [textField.text substringWithRange:NSMakeRange(i, 1)];
const char *cString = [tmp UTF8String];
//UTF8编码中中文字符长3位
if (strlen(cString) == 3)
{
count++;
}
}
textField.text = [textField.text substringToIndex:(MaxInputLength - count)];
}
实现输入改变回调
这里是因为中文键盘的情况会突破字数限制导致回调函数实效,所以要先判断是否输入键盘为中文类型。
- (void)textFieldDidChange:(UITextField *)textField {
if (textField == _personNameText) {
// 如果需要禁止输入的字符
// NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"@/:;()……#¥%&*——+~!{}|、[]‘“”’》《,。=-[email protected]#$%^&*()+{}|:><?[]\‘,;./‘\"\\`=-"];
// textField.text = [textField.text stringByTrimmingCharactersInSet:set];
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 ([self getStringLength:textField.text] > MaxInputLength) {
[self setTextFieldText:textField];
}
}else {
if ([self getStringLength:textField.text] > MaxInputLength) {
[self setTextFieldText:textField];
}
}
总结
最后的输入在极限状态下是:比如限定10个字长,那么当中英文混合长度在9的时候,可输入一个英文字符而不能输入一个中文字符。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-03 02:25:50