- (BOOL)textField:(UITextField *)textField1 shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSInteger pointLength =0;
if (textField1 ==_addGroupView.textField) {
NSInteger existedLength = textField1.text.length;
NSInteger selectedLength = range.length;
NSInteger replaceLength = string.length;
pointLength = existedLength - selectedLength + replaceLength;
}
//超过16位就不能在输入了
if (pointLength >12) {
returnNO;
}else{
returnYES;
}
}
以上方法在iPhone自带键盘时会出现问题。后来找到如下方法。
在textField中
首先:添加监听方法 。[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
然后实现方法:
- (void)textFieldDidChange:(UITextField *)textField
{
int length = 5;//限制的字数
NSString *toBeString = textField.text;
NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage]; // 键盘输入模式
if ([lang isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写
UITextRange *selectedRange = [textField markedTextRange]; //获取高亮部分
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
// 没有高亮选择的字,则对已输入的文字进行字数统计和限制
if (!position || !selectedRange)
{
if (toBeString.length > length)
{
NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:length];
if (rangeIndex.length == 1)
{
textField.text = [toBeString substringToIndex:length];
}
else
{
NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, length)];
textField.text = [toBeString substringWithRange:rangeRange];
}
}
}
}
}
对于TextView,本来就有 textViewDidChange: 方法。直接实现就好。
- (void)textViewDidChange:(UITextView *)textView
{
if (textView.text.length > TEXT_MAXLENGTH) {
UITextRange *markedRange = [textView markedTextRange];
if (markedRange) {
return;
}
//Emoji占2个字符,如果是超出了半个Emoji,用15位置来截取会出现Emoji截为2半
//超出最大长度的那个字符序列(Emoji算一个字符序列)的range
NSRange range = [textView.text rangeOfComposedCharacterSequenceAtIndex:TEXT_MAXLENGTH];
textView.text = [textView.text substringToIndex:range.location];
}
}