2014-06-24 121 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 
     } 
    }