iOS 限制字符输入长度(完善版本)

在开发中遇到一个问题,姓名输入框需要限制输入8个字符,如果是简单的监听文字改变,判断并截取前8个字符的话会出发一个bug,当输入到最后几个字符时输入的拼音也会算在8个字符中并被截取,用起来体验很不好,最后几个字会很难打。所以有下面这种处理方法:

1、添加监听 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textFiledEditChanged:)
name:@"UITextFieldTextDidChangeNotification"
object:myTextField];

或者

[myTextField addTarget:self action:@selector(textFieldTextChanged:) forControlEvents:UIControlEventEditingChanged];

2、-(void)textFiledEditChanged:(NSNotification *)obj{//这里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 = [textField positionFromPosition:selectedRange.start offset:0];
// 没有高亮选择的字,则对已输入的文字进行字数统计和限制 kMaxLength是想要限制的长度值
if (!position) {
if (toBeString.length > kMaxLength) {
textField.text = [toBeString substringToIndex:kMaxLength];
}
}
// 有高亮选择的字符串,则暂不对文字进行统计和限制
else{

}
}
// 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
else{
if (toBeString.length > kMaxLength) {
textField.text = [toBeString substringToIndex:kMaxLength];
}
}
}
3、-(void)dealloc{//如果是添加的监听,不要忘记移除
[[NSNotificationCenter defaultCenter]removeObserver:self
name:@"UITextFieldTextDidChangeNotification"
object:_albumNameTextField];
}

原文地址:https://www.cnblogs.com/chzheng/p/7845667.html