最近因為項目中輸入用戶簡稱時限制長度,被測試部多次提交問題,最終將解決方法分享給大家。
剛開始用最簡單的方法,在textView的代理方法里面做處理
1 - (void)textViewDidChange:(UITextView *)textView 2 { 3 textCountlabel.text = [NSString stringWithFormat:@"%lu", (unsigned long)30 - textView.text.length]; 4 } 5 6 7 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 8 { 9 if ([text isEqualToString:@"\n"]) 10 { 11 [textView resignFirstResponder]; 12 return NO; 13 } 14 15 if (range.location > 30) 16 { 17 return NO; 18 } 19 else 20 { 21 return YES; 22 } 23 }
這種情況下需要正好輸入限定的長度時才好使,一次性拼音拼出來的字超過固定長度時textView的內容保持不變。
后來又修改成超過限定長度時直接從前到后取需要長度,代碼如下:
1 - (void)textViewDidChange:(UITextView *)textView 2 { 3 if (textView.text.length > 30) 4 { 5 textView.text = [textView.text substringToIndex:30]; 6 7 [[[UIAlertView alloc] initWithTitle:@"提示" message:@"限定長度為30" delegate:nil cancelButtonTitle:@"確定" otherButtonTitles: nil] show]; 8 } 9 textCountlabel.text = [NSString stringWithFormat:@"%lu", (unsigned long)30 - textView.text.length]; 10 } 11 12 13 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 14 { 15 if ([text isEqualToString:@"\n"]) 16 { 17 [textView resignFirstResponder]; 18 return NO; 19 } 20 return YES; 21 }
修改完后自己親測通過,萬萬沒想到測試部又提交上來了。問題內容大概是剩余兩個字的時候拼音拼到一半(實際是輸入兩個字母)就提示了。根據問題又找到了原因:自己用第三方輸入法,輸入漢字時直接拼音不會到textView里面,測試部用的是手機系統輸入法,拼的時候拼音直接就是textView的內容,這樣就導致剩余兩個字想輸入“測試”,結果到“ces”的時候就提示了,找到原因就可以解決問題了,直接上代碼:
1 #define MAXSTRINGLENGTH 15 //限定輸入長度 2 3 4 - (void)textViewDidChange:(UITextView *)textView 5 { 6 NSString *lang = [[[UITextInputMode activeInputModes] firstObject] primaryLanguage];//當前的輸入模式 7 if ([lang isEqualToString:@"zh-Hans"]) 8 { 9 UITextRange *range = [textView markedTextRange]; 10 UITextPosition *start = range.start; 11 UITextPosition*end = range.end; 12 NSInteger selectLength = [textView offsetFromPosition:start toPosition:end]; 13 NSInteger contentLength = textView.text.length - selectLength; 14 15 if (contentLength > MAXSTRINGLENGTH) 16 { 17 textView.text = [textView.text substringToIndex:MAXSTRINGLENGTH]; 18 [[[UIAlertView alloc] initWithTitle:@"提示" message:@"最長限制15個字" delegate:nil cancelButtonTitle:@"確定" otherButtonTitles: nil] show]; 19 20 } 21 if (contentLength < MAXSTRINGLENGTH) 22 { 23 textCountlabel.text = [NSString stringWithFormat:@"還剩%ld個字", MAXSTRINGLENGTH - contentLength]; 24 } 25 else 26 { 27 textCountlabel.text = @"還剩0個字"; 28 } 29 } 30 else 31 { 32 if (textView.text.length > MAXSTRINGLENGTH) 33 { 34 textView.text = [textView.text substringToIndex:MAXSTRINGLENGTH]; 35 [[[UIAlertView alloc] initWithTitle:@"提示" message:@"最長限制15個字" delegate:nil cancelButtonTitle:@"確定" otherButtonTitles: nil] show]; 36
37 } 38 textCountlabel.text = [NSString stringWithFormat:@"還剩%ld個字", MAXSTRINGLENGTH-textView.text.length]; 39 } 40 } 41