【发布时间】:2013-09-11 17:29:10
【问题描述】:
我有一个类似于 Twitter 的用户名系统,使用 @ 符号。
我已将其设置为通过键入@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,这是我的朋友@goodfriend
这次它仍然显示第一个@username,但忽略第二个@goodfriend。
我认为最好的方法是告诉 NSScanner 引用最后一次出现的 @ 符号,因为我现在只引用第一个 @ 符号。
这也可能与我检测空白以知道用户已完成输入用户名的方式有关,并且不需要更多建议。
希望对您有所帮助,谢谢!
【问题讨论】:
-
您能发布一个您期望的输入/输出示例吗?
-
@Alladinian 我更新了原始帖子,详细说明了我正在尝试做的事情。简而言之,我需要能够检测用户何时开始输入 @ 符号和用户名,并根据他们输入的内容显示建议。它现在只使用一个用户名,但有两个用户名,它会忽略第二个和第三个,等等
标签: ios nsstring nsrange nsscanner