之前遇到一種情況,限制textfield長度,並且要適配多語言,做到,例如中文占2字符,英文占1字符,還有考慮其他語言,網上找了很多方法,不太合適,最后結合網上的方案,修改出了還比較適用。
首先,增加對textfield文字改變的監聽,
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textFiledEditChanged:) name:UITextFieldTextDidChangeNotification object:nil];//修改用戶名監聽,以改變修改按鈕的位置
需要記得在最后要移除監聽!
[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];
這里寫的監聽方法是textFiledEditChanged: 文字改變就會調用該方法,思路就是限制長度,超出就截斷字符串,所以要考慮的問題是:1、什么時候超出長度?2、在哪截斷。還有一個問題就是,在用拼音輸入中文的時候,拼音字母還沒轉換為中文,但是也會引起變化並調用這個方法,如果在這個方法里面獲取textfield的文字,會獲取到中文和還沒轉中文的字母和自動加的空格...所以這個問題需要處理,不然會造成例如最多能輸入5個中文(10個英文字母),當你輸入了4個中文后,你后面只能輸入兩個字母來拼出一個中文,這是不合理的。解決方法是不統計這些還未轉換到字母,(注:還未轉換稱之為高亮狀態)。
下面解決這些問題:首先,區分中英文的長度(同樣適用於多語言),思路是能轉ascii碼的和不能轉的分開統計,那么就要遍歷字符串,分開一個一個字符,在遍歷的時候可以同時確定要截取字符串的位置,代碼如下:
- (CGFloat)countW:(NSString *)s { int i;CGFloat n=[s length],l=0,a=0,b=0; CGFloat wLen=0; unichar c; for(i=0;i<n;i++){ c=[s characterAtIndex:i];//按順序取出單個字符 if(isblank(c)){//判斷字符串為空或為空格 b++; }else if(isascii(c)){ a++; }else{ l++; } wLen=l+(CGFloat)((CGFloat)(a+b)/2.0); NSLog(@"wLen--%f",wLen); if (wLen>=4.5&&wLen<5.5) {//設定這個范圍是因為,當輸入了當輸入9英文,即4.5,后面還能輸1字母,但不能輸1中文 _subLen=l+a+b;//_subLen是要截取字符串的位置 } } if(a==0 && l==0) { _subLen=0; return 0;//只有isblank } else{ return wLen;//長度,中文占1,英文等能轉ascii的占0.5 } }
監聽方法如下:
-(void)textFiledEditChanged:(NSNotification *)obj{ @try{ UITextField *textField = _userNameTf; NSString *str = [[textField text] stringByReplacingOccurrencesOfString:@"?" withString:@""];//輸入的字符,包括鍵盤上高亮的未轉成中文的拼音 NSLog(@"str--%@",str); UITextRange *selectedRange = [textField markedTextRange]; UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];//高亮 if (!position) {//沒高亮的文字 CGFloat ascLen=[self countW:str];//沒高亮,獲取長度 NSLog(@"ascLen------------------%f",ascLen); if (ascLen > 5) { NSString *strNew = [NSString stringWithString:str]; NSLog(@"strNew--%@",strNew); NSLog(@"_subLen%f",_subLen); if (_subLen==0) { _subLen=strNew.length; } [textField setText:[strNew substringToIndex:_subLen]]; } } else{ // NSLog(@"輸入的英文還沒轉化為漢字");//只是高亮,不應該算長度 } } @catch(NSException *exception) { NSLog(@"exception:%@", exception); } @finally { } }