目前我是这么操作的
1.UITextField *Name;
//监听键盘输入
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(NameTextDidChange:) name:@"UITextFieldTextDidChangeNotification" object:_Name];
注:name一定不能随便改,不然调不到事件
#pragma mark 限制名字的最大长度4
- (void)NameTextDidChange:(NSNotification *)obj{
UITextField *textField = (UITextField *)obj.object;
NSString *toBeString = textField.text;
NSString *lang = [textField.textInputMode primaryLanguage];
if ([lang isEqualToString:@"zh-Hans"])// 简体中文输入
{
//获取高亮部分
UITextRange *selectedRange = [textField markedTextRange];
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
// 没有高亮选择的字,则对已输入的文字进行字数统计和限制
if (!position)
{
if (toBeString.length > 4)
{
textField.text = [toBeString substringToIndex:4];
}
}
}
// 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
else
{
if (toBeString.length > 4)
{
NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:4];
if (rangeIndex.length == 1)
{
textField.text = [toBeString substringToIndex:4];
}
else
{
NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, 4)];
textField.text = [toBeString substringWithRange:rangeRange];
}
}
}
}
2.UITextView *QianMing;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(QianMingTextDidChange:) name:@"UITextViewTextDidChangeNotification" object:_QianMing];
#pragma mark 限制签名的最大长度100
- (void)QianMingTextDidChange:(NSNotification *)obj{
UITextView * textView = (UITextView *)obj.object;
NSString * toBeString = textView.text;
NSString * lang = [textView.textInputMode primaryLanguage];
if ([lang isEqualToString:@"zh-Hans"]) {//简体中文
//获取高亮部分
UITextRange * selectRange = [textView markedTextRange];
UITextPosition * position = [textView positionFromPosition:selectRange.start offset:0];
//没有高亮选择的字,则对已输入的文字进行字数统计和限制
if (!position) {
if (toBeString.length > MAX_LENGTH) {
textView.text = [toBeString substringToIndex:MAX_LENGTH];
}
}
}else{//中文输入法以外直接对其统计限制即可,不考虑其他语种情况
if (toBeString.length > MAX_LENGTH) {
NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:MAX_LENGTH];
if (rangeIndex.length == 1) {
textView.text = [toBeString substringToIndex:MAX_LENGTH];
}else{
NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, MAX_LENGTH)];
textView.text = [toBeString substringWithRange:rangeRange];
}
}
}
}
这是以前写的
- (void)viewDidLoad {
[super viewDidLoad];
[self.TextField addTarget:self action:@selector(textFieldChanged:) forControlEvents:UIControlEventEditingChanged];
self.TextField.delegate = self;
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
return YES;
}
- (void)textFieldChanged:(UITextField *)textField{
NSString * toBeString = textField.text;
if (![self isINputRuleAndBlank:toBeString]) {
textField.text = [self disable_emoji:toBeString];
return;
}
//获取当前键盘输入模式
NSString * lang = [[textField textInputMode] primaryLanguage];
NSLog(@"%@", lang);
if ([lang isEqualToString:@"zh-hans"]) {
//简体中文,第三方输入法,所有模式下都会显示“zh-hans”
UITextRange * selectedRange = [textField markedTextRange];
//获取高亮部分
UITextPosition * position = [textField positionFromPosition:selectedRange.start offset:0];
//没有高亮选择的字,则对已输入的文字进行字数统计和限制
if (!position) {
NSString * getStr = [self getSubString:toBeString];
if (getStr && getStr.length > 0) {
textField.text = getStr;
}
}
}else{
NSString * getStr = [self getSubString:toBeString];
if (getStr && getStr.length > 0) {
textField.text = getStr;
}
}
}
/**
*字母,数字,中文正则判断(不包括空格)
*/
- (BOOL)isINputRuleNotBlank:(NSString *)str {
NSString * pattern = @"^[a-zA-Z\u4E00-\u9FA5\\d]*$";
NSPredicate * pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:str];
return isMatch;
}
/**
*字母,数字,中文正则判断(包括空格)(在系统输入法中文输入时会出现拼音之间有空格,需要忽略,当按return键时会自动用字母替换,按空格输入响应汉字)
*/
- (BOOL)isINputRuleAndBlank:(NSString *)str {
NSString * pattern = @"^[a-zA-Z\u4E00-\u9FA5\\d\\s]*$";
NSPredicate * pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:str];
return isMatch;
}
/**
*
*/
- (NSString *)getSubString:(NSString *)str {
NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSData * data = [str dataUsingEncoding:encoding];
NSInteger length = [data length];
if (length > MAXLEGTH) {
NSData * data1 = [data subdataWithRange:NSMakeRange(0, MAXLEGTH)];
NSString * content = [[NSString alloc] initWithData:data1 encoding:encoding];//注意:当截取kMaxLength长度字符时把中文字符截断返回的content会是nil
if (!content || content.length == 0) {
data1 = [data subdataWithRange:NSMakeRange(0, MAXLEGTH - 1)];
content = [[NSString alloc] initWithData:data1 encoding:encoding];
}
return content;
}
return nil;
}
- (NSString *)disable_emoji:(NSString *)str{
NSRegularExpression * regex = [NSRegularExpression regularExpressionWithPattern:@"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]" options:NSRegularExpressionCaseInsensitive error:nil];
NSString * modifiedString = [regex stringByReplacingMatchesInString:str options:0 range:NSMakeRange(0, str.length) withTemplate:@""];
return modifiedString;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}