在开发中,可能会遇到服务器后台数据库不能识别IOS系统表情,导致存储出错的问题,所以就需要禁止系统emoji表情的输入.并且有时候会用到限制数字的问题,找了好多种方法总算找到一种比较好的方法.
先看一下效果
下面是实现代码
1. 添加代理及文本输入响应事件
[textField addTarget:self action:@selector(textFiledEditChanged:) forControlEvents:UIControlEventEditingChanged];
textField.delegate = self;
2. 实现代理方法以及相应方法
2.1 实现代理方法
为了使输入模式为emoji时不能进行输入操作
#pragma mark ----UITextFieldDelegate
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
//当文本输入模式为"emoji"时禁止输入
if ([[[UITextInputMode currentInputMode] primaryLanguage] isEqualToString:@"emoji"]) {
return NO;
}
return YES;
}
2.2 实现响应事件
虽然不能通过表情界面输入表情了,可是当输入法为中文的时候还是可以联想出emoji的,所以为了解决这个问题,就必须为UITextField添加响应事件来解决.
- (void)textFiledEditChanged:(UITextField *)textField {
if (textField.text.length > 0) {
// 禁止系统表情的输入
NSString *text = [self disable_emoji:textField.text];
if (![text isEqualToString:textField.text]) {
textField.text = text;
}
}
//获取高亮部分
UITextRange *selectedRange = [textField markedTextRange];
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
// 没有高亮选择的字,则对已输入的文字进行字数统计和限制
if (!position) {
if (textField.text.length > MAX_STRING_LENGTH) {
textField.text = [textField.text substringToIndex:MAX_STRING_LENGTH];
}
}
}
- (NSString *)disable_emoji:(NSString *)text{
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:text
options:0
range:NSMakeRange(0, [text length])
withTemplate:@""];
return modifiedString;
}
其中MAX_STRING_LENGTH
为文本最大字数(自己设置),emoji的Unicode编号为:Emoji
3. 参考资料
4. DEMO
本篇文章写的小DEMO