2014-06-24 164 views
0
#define MAXLENGTH 12 
- (BOOL)textField:(UITextField *) textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

    if (textField.tag == NICKNMAE_TAG) { 
     NSUInteger oldLength = [textField.text length]; 
     NSUInteger replacementLength = [string length]; 
     NSUInteger rangeLength = range.length; 

     NSUInteger newLength = oldLength - rangeLength + replacementLength; 

     BOOL returnKey = [string rangeOfString: @"\n"].location != NSNotFound; 

     return newLength <= MAXLENGTH || returnKey; 
    } 
    return YES; 

} 

我用這個方法來限制文本字段的長度。它在通常的 字符中工作。不幸的是,輸入中文字符時不起作用。UITextfield限制中文字符長度

+0

你可以舉一些例子說明輸入和輸出,使人們可以看到確切的問題? – mc110

+1

該文本框輸入10個漢字,如「哈哈哈哈哈哈哈哈哈哈」,然後輸入任意字符,會出現一些字。您選擇任何字詞,鍵盤將提供與單詞選擇相關的關聯。選擇相關詞語,總長度會比最大長度長。 – Dennis

回答

2

當輸入一些使用輸入法的語言時,拼音的輸入會使-textField: shouldChangeCharactersInRange:replacementString被調用,並且當您選擇中文字符時,會發生另一個對此方法的調用,遺憾的是,您無法區分此方法是通過輸入拼音或改變漢語拼音來調用。

因此,允許用戶輸入超出限制的字符總是更好,但不允許用戶提交輸入。你可以看到微博如何在用戶輸入時進行此操作。

心中已經找到另一種解決辦法: 你可以使用@property markedTextRange,通過它可以得到,如果有正在等待中國人物選擇任何拼音,如果有任何,你不限制輸入字符串長度,並且一旦用戶將所有拼音轉換成漢字,則可以在限制時截斷中文字符串。

+0

是的,我使用微博等方法。 – Dennis

0

你可以試試這個:

UITextField *textField = [UITextField new]; 
[textField addTarget:self action:@selector(textFieldChanged:) forControlEvents:UIControlEventEditingChanged]; 

- (void)textFieldChanged:(UITextField *)textField { 
    NSString *text = textField.text; 

    UITextRange *selectedRange = [textField markedTextRange]; 
    UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0]; 

    NSInteger maxLegnth = 5; 

    if (!position) 
    { 
     if (text.length > maxLegnth) 
     { 
      NSRange rangeIndex = [text rangeOfComposedCharacterSequenceAtIndex:maxLegnth]; 
      if (rangeIndex.length == 1) 
      { 
       textField.text = [text substringToIndex:maxLegnth]; 
      }else { 
       NSRange rangeRange = [text rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, maxLegnth)]; 
       textField.text = [text substringWithRange:rangeRange]; 
      } 
     } 
    } 
} 
0

我都面臨着同樣的問題,我的同事可愛給出一個解決方案。

對於UIControlEventAllEditingEvents,我們需要添加一個目標UITextField

[textField addTarget:self action:@selector(actionTextFiledDidChange:) forControlEvents:UIControlEventAllEditingEvents];

如果textFiled.markedTextRange不是零,截斷文本,以適應最大長度,否則離開它。

- (void)actionTextFiledDidChange:(UITextField *)textFiled { 
    if (textFiled.markedTextRange == nil && textFiled.text.length > MAX_NAME_INPUT_LEN) { 
     textFiled.text = [textFiled.text substringToIndex:MAX_NAME_INPUT_LEN]; 
    } 
} 

UITextFieldDelegate,邏輯不改變。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    NSInteger newLen = textField.text.length - range.length + string.length; 
    return (newLen <= MAX_NAME_INPUT_LEN); 
} 
0

快速的版本:

yourTextField.addTarget(self 
      , action: #selector(XXXXX.textFieldValueDidChanged(_:)) 
      , forControlEvents: .EditingChanged) 

func textFieldValueDidChanged(textField: UITextField) { 
     let limit = 100 
     let txt = textField.text ?? "" 

     guard nil == textField.markedTextRange else { return } 

     if txt.characters.count > limit { 
      let finalTxt = txt.substringWithRange(txt.startIndex..<txt.startIndex.advancedBy(limit)) 

      textField.text = finalTxt 
     } 
    }