UItextView针对删除表情特殊字符串处理
1.监听键盘删除键,调用以下方法
2.判断特殊表情字符串格式,我的特殊表情字符串格式为"[xx]",字符长度为4
需注意两个特殊情况:
1.当监听键盘删除键的条件为if(text.length == 0 && range.length == 1)时,长按textView字符串调用系统UIMenuController选择且只选择一个字符串删除时也恰好符合该条件,须另外处理;
2.当判断要删除的字符符合表情特殊字符“]”首要条件时而“]”前的的字符串长度不足4个时也须另外处理;
以下代码中均有详细处理
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if(text.length == 0 && range.length == 1) //删除
{ // 用于针对删除表情特殊字符串处理
// 1.特殊情况长按调用系统UIMenuController只选择一个字符串删除
if (_InputTextView.selectedRange.length == 1) { // 选定的文本长度
return YES;
// int loction = _InputTextView.selectedRange.location;// 获取光标位置
// // 获取光标前一个字符串
// unichar strxmlchar = [_InputTextView.text characterAtIndex:(loction -1 )];
// NSString *str=[NSString stringWithFormat:@"%C",strxmlchar];
}
NSInteger loction = _InputTextView.selectedRange.location;// 获取光标位置
NSString *frontContent = [_InputTextView.text substringToIndex:loction];// 获取光标位置前的字符串
// 字符串以结尾比较,存在“]”
if ([frontContent hasSuffix:@"]"])
{
NSInteger stringLength = frontContent.length;
NSString *string = nil;
BOOL exist = NO;
if ( stringLength >= 4 )// 表情转义字符的长度( [1个长度,xx占2个长度,,]1个长度,共4个长度 )
{ // 符合表情特殊字符串条件
string = [frontContent substringFromIndex:stringLength - 4];// 截取此时字符串的后四位
NSRange range = [string rangeOfString:@"["];// 判断首位是否存在“[”
if ( range.location == 0 ) { // 存在表情特殊字符串
string = [frontContent substringToIndex:[frontContent rangeOfString:FACE_NAME_HEAD options:NSBackwardsSearch].location];// 将获取的光标位置前的字符串删减表情特殊字符串(四个字符)
exist = YES;
}
else { // 不存在表情特殊字符串
string = [frontContent substringToIndex:stringLength - 1];
exist = NO;
}
}
else
{
return YES;
}
NSString *backContent = [_InputTextView.text substringFromIndex:loction];// 获取光标位置后的字符串
if (backContent.length > 0) {
// 拼接删除字符后的字符串
_InputTextView.text = [string stringByAppendingString:backContent];
}
else
_InputTextView.text = string;
NSRange range;
range.length = 0;
if (exist) {
range.location = loction - FACE_NAME_LEN;
}
else{
range.location = loction - 1;
}
_InputTextView.selectedRange = range; // 调整光标位置
return NO;
}
else
return YES;
}
return YES;
}