开发中经常会遇到输入限制, 常用方法是设置keyboardType
类型, 但是也会出现用户切换键盘输入emoji表情导致服务器提示服务异常的情况。
此时,输入过滤就尤为重要。
怎么过滤呢?
-
添加字符串的类别方法
-
在输入中进行过滤处理
创建一个NSStirng的类别, 添加如下两个方法:
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface NSString (FilterEmoji)
// 字符串过滤掉emoji
+ (NSString *)filterEmoji:(NSString *)string;
// 判断是否包含emoji
+ (BOOL)stringContainsEmoji:(NSString *)string;
@end
NS_ASSUME_NONNULL_END
在NSString+FilterEmoji.m
文件中实现这两个方法:
#import "NSString+FilterEmoji.h"
@implementation NSString (FilterEmoji)
+ (NSString *)filterEmoji:(NSString *)string{
__block NSString *newText = @"";
BOOL isContainsEmoji = [NSString stringContainsEmoji:string];
if (isContainsEmoji){
if (string.length == 1){
newText = [string substringToIndex:string.length - 1];
}else{
newText = [string substringToIndex:string.length - 2];
}
}else{
newText = string;
}
return newText;
}
+ (BOOL)stringContainsEmoji:(NSString *)string{
__block BOOL returnValue = NO;
[string enumerateSubstringsInRange:NSMakeRange(0, string.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
const unichar hs = [substring characterAtIndex:0];
if (0xd800 <= hs && hs <= 0xdbff){
if (substring.length > 1){
const unichar ls = [substring characterAtIndex:1];
const int uc = (hs - 0xd800) * 0x400 + (ls - 0xdc00) + 0x10000;
if (0x1d000 <= uc && uc <= 0x1f77f){
// 有emoji;
returnValue = YES;
}
}
}else if (substring.length > 1){
const unichar ls = [substring characterAtIndex:1];
if (ls == 0x20e3){
// 有emoji
returnValue = YES;
}
}else{
if (0x2100 <= hs && hs <= 0x27ff){
returnValue = YES;
}else if (0x2B05 <= hs && hs <= 0x2b07){
returnValue = YES;
}else if (0x2934 <= hs && hs <= 0x2935){
returnValue = YES;
}else if (0x3297 <= hs && hs <= 0x3299){
returnValue = YES;
}else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50 ){
returnValue = YES;
}else if (hs == 0x200d){
returnValue = YES;
}
}
}];
return returnValue;
}
@end
在需要处理的类中导入NSString+FilterEmoji.h
文件,实现UITextField
或者UITextView
的代理, (这里以UITextField为例)
先屏蔽系统键盘的emoji输入:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(nonnull NSString *)string
{
if ([textField isFirstResponder])
{
if ([[[textField textInputMode] primaryLanguage] isEqualToString:@"emoji"] || ![[textField textInputMode] primaryLanguage])
{
return NO;
}
}
return YES;
}
在UITextFieldTextDidChangeNotification或者UIControlEventEditingChanged方法中, 处理输入字符的过滤:
- (void)inputTextDidChange:(NSNotification *)notifi{
UITextField *InputText = (UITextField *)[notifi object];
NSString *text =InputText.text;
// 过滤一下emoji
if ([NSString stringContainsEmoji:text] == YES)
{
text = [NSString filterEmoji:text];
InputText.text = text;
}
}
仅记录自己常用方法,欢迎探讨。
网友评论