我有一个使用 @ 符号的类似于 twitters 的用户名系统。
我通过输入@username 将其设置为向用户发送消息。这与 Twitter 中的提及基本相同。
到目前为止,我已经能够检测到 @ 符号后面的文本,并在它碰到空白时停止检测。这已经用 NSScanner 完美地完成了。
我的问题是如果我想给多个@usernames 发送消息,NSScanner 只会检测到第一次出现。我需要它来检测最新的事件。我发现这是一个有用的工具:
NSRange lastSymbol = [text rangeOfString:@"@" options:NSBackwardsSearch];
我似乎无法弄清楚如何与 NSScanner 一起正确使用它。这是我的代码尝试的 2 个示例。
示例 1:
NSString *user = nil;
NSString *text = textView.text;
NSRange lastSymbol = [text rangeOfString:@"@" options:NSBackwardsSearch];
if (lastSymbol.location != NSNotFound) {
NSScanner *userScanner = [NSScanner scannerWithString:text];
[userScanner scanUpToString:@"@" intoString:nil];
NSCharacterSet *charset = [NSCharacterSet characterSetWithCharactersInString:@"@"];
if (![userScanner isAtEnd]) {
[userScanner scanUpToCharactersFromSet:charset intoString:nil];
[userScanner scanCharactersFromSet:charset intoString:nil]
[userScanner scanUpToCharactersFromSet:charset intoString:&user];
}
}
if (user.length > 0) {
NSRange whiteSpaceRange = [user rangeOfCharacterFromSet:[NSCharacterSet whitespaceCharacterSet]];
if (whiteSpaceRange.location != NSNotFound) {
// White space, username has ended
} else {
// Still getting username
NSLog(@"%@", user);
}
}
如您所见,我只是不太确定如何使这些协同工作以产生我正在寻找的结果。有任何想法吗?谢谢!
**************************更新*********************** *****
更具体地说,当用户输入 @ 符号并开始输入用户名时,我想根据他们输入的内容显示他们的朋友列表。所以很自然地,我想拉出@符号后面的字符串,并且随着用户不断输入,不断更新他们的朋友列表。一旦用户输入了一个空格,我们假设他们已经输入了用户名(用户名不能包含空格),所以我停止显示表格视图。
到目前为止,上面的代码只是检测并拉取@符号后面的字符串。这是现在的输出:
文本字段文本:你好@username
这非常有效,正如您所看到的,我可以继续对照一系列朋友检查此文本。
假设用户想用相同的文本向另一个用户发送消息,如下所示:
你好@username,这是我的朋友@goodfriend
这次它仍然显示第一个@username,但忽略第二个@goodfriend。
我认为最好的方法是告诉 NSScanner 引用最后一次出现的 @ 符号,因为我现在只引用第一个 @ 符号。
这也可能与我检测空白以知道用户已完成输入用户名的方式有关,并且不需要更多建议。
希望这会有所帮助,谢谢!