附上代码
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.nameArray = [NSMutableArray array];
self.delegate = self;
}
return self;
}
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if ([text isEqualToString:@""]) {//删除
return ![self deleteAtUser:range];
}else{
if ([text isEqualToString:@"@"]) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self configAt:NSMakeRange(range.location, 1)];
});
}
}
return YES;
}
- (void)configAt:(NSRange)range
{
NSString *lang = self.textInputMode.primaryLanguage;
if([lang isEqualToString:@"zh-Hans"]){ //简体中文输入,包括简体拼音,健体五笔,简体手写
UITextRange *selectedRange = [self markedTextRange];
UITextPosition *position = [self positionFromPosition:selectedRange.start offset:0];
if (!position){//非高亮
[self configRange:range];
}
}else{//中文输入法以外
[self configRange:range];
}
}
- (BOOL)deleteAtUser:(NSRange)range
{
for (NSString *name in self.nameArray) {
NSString *atName = [self getAtNameWith:name];
NSRange atRange = [self.text rangeOfString:atName];
if (range.location>=atRange.location && range.location <= atRange.location + atRange.length) {
NSMutableString *mStr = [[NSMutableString alloc]initWithString:self.text];
[mStr deleteCharactersInRange:atRange];
self.text = mStr;
self.selectedRange = NSMakeRange(atRange.location, 0);//定位光标
return YES;
}
}
return NO;
}
- (NSString *)getAtNameWith:(NSString *)name
{
return [NSString stringWithFormat:@"@%@",name];
}
- (void)configRange:(NSRange)range
{
NSMutableString *mutableString = [[NSMutableString alloc]initWithString:self.text];
[mutableString deleteCharactersInRange:range];
@weakify(self);
[[self getText] subscribeNext:^(id x) {
@strongify(self);
[self.nameArray addObject:x];
NSString *name = [self getAtNameWith:x];
dispatch_async(dispatch_get_main_queue(), ^{
[mutableString insertString:name atIndex:range.location];
self.text = mutableString;
self.selectedRange = NSMakeRange(range.location + name.length, 0);//定位光标
});
}];
}
- (RACSignal *)getText
{
return [RACSignal startEagerlyWithScheduler:[RACScheduler scheduler] block:^(id<RACSubscriber> subscriber) {
NSInteger random = arc4random_uniform(100);
[subscriber sendNext:[NSString stringWithFormat:@"张三%@",@(random)]];
[subscriber sendCompleted];
}];
}