標籤:
如題的問題,又是個讓我抓狂了大半天的問題,還是做個記錄,有與類似問題的同學可參考,但不一定對。具體問題還需具體分析。我遇到的需求是這樣的:有一個輸入框,輸入框內輸入文字,文字字數限制在20字。 我採用了UITextField作為我的輸入框控制項,並且在委託方法: - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 中實現了對字串的長度限制,實現如下: #define kMaxLength 20
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
NSString * toBeString = [textField.text stringByReplacingCharactersInRange:range withString:string];
if (toBeString.length > kMaxLength && range.length!=1){
textField.text = [toBeString substringToIndex:kMaxLength];
return NO;
}
return YES;
} 這樣實現的結果是:對於純字元的統計沒有什麼問題,當輸入的字元超過限制時輸入框便截取最大限制長度的字串。但是,有個問題,當使用拼音IME時,該委託方法中的最後一個參數string接受的是輸入的字母,而不是選擇的漢字,造成的結果是,當想輸入文字“我在編程”,輸入拼音“wozaibiancheng”,每輸入一個字母便會進入委託方法,統計的字元長度是字母的長度,實際上漢字還未超過限制長度,但是字母的長度超過了導致無法繼續輸入。 而且,致命的是,這個委託方法並不響應,選中候選漢字的過程,這就沒有辦法重新修正字元長度的統計了。 我剛開始時候並沒有發現 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 這個委託方法沒有響應最後拼音到漢字的過程,當我發現這個問題時,問題便也差不多得到瞭解決。1、因為在之前向微博上的一個朋友諮詢時,他告訴我可以註冊這個觀察者 UITextInputCurrentInputModeDidChangeNotification在它的監聽下可以得到中文。我剛開始時候理解錯了他的意思,以為得到的就是最終選中的漢字,而中間輸入的拼音並不會被得到。但其實這個監聽,比以上的委託方法多了最後一步而已,即從拼音到中文的過程。 所以實現的代碼如下。<1>在init時候註冊notification: [[NSNotificationCenter defaultCenter]addObserver:selfselector:@selector(textFiledEditChanged:)
name:@"UITextFieldTextDidChangeNotification"
object:myTextField]; <2>實現監聽方法: -(void)textFiledEditChanged:(NSNotification *)obj{
UITextField *textField = (UITextField *)obj.object;
NSString *toBeString = textField.text;
NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage]; // 鍵盤輸入模式
if ([lang isEqualToString:@"zh-Hans"]) { // 簡體中文輸入,包括簡體拼音,健體五筆,簡體手寫
UITextRange *selectedRange = [textField markedTextRange];
//擷取高亮部分
UITextPosition *position = [textFieldpositionFromPosition:selectedRange.start offset:0];
// 沒有高亮選擇的字,則對已輸入的文字進行字數統計和限制
if (!position) {
if (toBeString.length > kMaxLength) {
textField.text = [toBeString substringToIndex:kMaxLength];
}
}
// 有高亮選擇的字串,則暫不對文字進行統計和限制
else{
}
}
// 中文IME以外的直接對其統計限制即可,不考慮其他語種情況
else{
if (toBeString.length > kMaxLength) {
textField.text = [toBeString substringToIndex:kMaxLength];
}
}
} <3>在dealloc裡登出掉監聽方法,切記! -(void)dealloc{
[[NSNotificationCenter defaultCenter]removeObserver:self
name:@"UITextFieldTextDidChangeNotification"
object:_albumNameTextField];
}
2、
[_expertSignature addTarget:self action:@selector(textFieldDidChangeEditing) forControlEvents:UIControlEventEditingChanged];
- (void)textFieldDidChangeEditing {
NSString *toBeString = self.expertSignature.text;
NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage];
if([lang isEqualToString:@"zh-Hans"]){ //簡體中文輸入,包括簡體拼音,健體五筆,簡體手寫
UITextRange *selectedRange = [self.expertSignature markedTextRange];
UITextPosition *position = [self.expertSignature positionFromPosition:selectedRange.start offset:0];
if (!position){//非高亮
if (toBeString.length > kMaxLength) {
[ToolUtil showHUD:@"您最多可以輸入22個字" duration:2];
self.expertSignature.text = [toBeString substringToIndex:kMaxLength];
}
}
}else{//中文IME以外
if (toBeString.length > kMaxLength) {
[ToolUtil showHUD:@"您最多可以輸入22個字" duration:2];
self.expertSignature.text = [toBeString substringToIndex:kMaxLength];
}
}
}
iOS:UITextField中文IME輸入時對字元長度的限制