需求描述

1. 发布信息时,通过键盘键入@符号,或者点选相关功能键,唤醒@列表,进行选择

2.选择结束后,输入栏改色显示相关内容

3.删除时,整体删除@区块,且不能让光标落在@区块之间


实现步骤

1. 键入@符号,触发相关功能

1 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
2 //判断键入的字符
3 if ([text isEqualToString:@"@"]) {
4 //触发相关功能
5 //[self pickRemaidBtnClick];
6 return NO;
7 }
8
9 return YES;
10 }



2. @区块颜色修改

(1)使用到的正则表达式

#define kATRegular @"@[\\u4e00-\\u9fa5\\w\\-\\_]+ "


(2)获取匹配到的区块下标数组

+ (NSArray *) getMatchsWithStr : (NSString *) text {
// 找到文本中所有的@
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:kATRegular options:NSRegularExpressionCaseInsensitive error:nil];
NSArray *matches = [regex matchesInString:text options:NSMatchingReportProgress range:NSMakeRange(0, [text length])];
return matches;
}


(3)修改文本颜色

-(void)textViewDidChange:(UITextView *)textView {
NSArray *matchs = [RemaidUserUtils getMatchsWithStr:textView.text];
//改色
[textView.textStorage addAttribute:NSForegroundColorAttributeName value:[UIColor colorWithHexString:@"#333333"] range:NSMakeRange(0, textView.text.length)];
for (NSTextCheckingResult *match in matchs)
{
[textView.textStorage addAttribute:NSForegroundColorAttributeName value:BLUECOLOR range:NSMakeRange(match.range.location, match.range.length - 1)];
}
}



3.删除时整体删除@区块

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{

if ([text isEqualToString:@""])
{
NSRange selectRange = textView.selectedRange;
if (selectRange.length > 0)
{
//用户长按选择文本时不处理
return YES;
}

// 判断删除的是一个@中间的字符就整体删除
NSMutableString *string = [NSMutableString stringWithString:textView.text];
NSArray *matches = [RemaidUserUtils getMatchsWithStr:string];

BOOL inAt = NO;
NSInteger index = range.location;
for (NSTextCheckingResult *match in matches)
{
NSRange newRange = NSMakeRange(match.range.location + 1, match.range.length - 1);
if (NSLocationInRange(range.location, newRange))
{
inAt = YES;
index = match.range.location;
[textView.textStorage replaceCharactersInRange:match.range withString:@""];
textView.selectedRange = NSMakeRange(index, 0);
[self textViewDidChange:textView];
return NO;
break;
}
}
}

return YES;
}



4.不允许光标落在@区块之间

- (void)textViewDidChangeSelection:(UITextView *)textView {
// 光标不能点落在@词中间
NSRange range = textView.selectedRange;
if (range.length > 0)
{
// 选择文本时可以
return;
}

NSArray *matches = [RemaidUserUtils getMatchsWithStr:textView.text];

for (NSTextCheckingResult *match in matches)
{
NSRange newRange = NSMakeRange(match.range.location + 1, match.range.length - 1);
if (NSLocationInRange(range.location, newRange))
{
if (range.location == match.range.location + 1) {
textView.selectedRange = NSMakeRange(match.range.location + match.range.length, 0);
} else {
textView.selectedRange = NSMakeRange(match.range.location , 0);
}
break;
}
}
}



chu