美文网首页iOS-UI藤原とうふ店(自家用)
UITextField限制输入字数以及限制emoji输入的实现方

UITextField限制输入字数以及限制emoji输入的实现方

作者: kikido | 来源:发表于2016-10-13 12:29 被阅读224次

    在开发中,可能会遇到服务器后台数据库不能识别IOS系统表情,导致存储出错的问题,所以就需要禁止系统emoji表情的输入.并且有时候会用到限制数字的问题,找了好多种方法总算找到一种比较好的方法.

    先看一下效果

    ![](http:https://img.haomeiwen.com/i1929756/e21314939da7701c.gif?imageMogr2/auto-orient/strip)

    下面是实现代码

    1. 添加代理及文本输入响应事件

    
    [textField addTarget:self action:@selector(textFiledEditChanged:) forControlEvents:UIControlEventEditingChanged]; 
    textField.delegate = self;
    

    2. 实现代理方法以及相应方法

    2.1 实现代理方法

    为了使输入模式为emoji时不能进行输入操作

    文本输入模式为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

    相关文章

      网友评论

      • upcode:博主,下面这段代码在干什么,为什么这么做,什么情境需要这么做?

        //获取高亮部分
        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];
        }
        }

      本文标题:UITextField限制输入字数以及限制emoji输入的实现方

      本文链接:https://www.haomeiwen.com/subject/fnswyttx.html