У меня есть система имен пользователей, похожая на твиттеры, использующая символ @.
Я настроил его для отправки сообщений пользователям, набрав @username. Это в основном идентично упоминаниям в Твиттере.
До сих пор мне удавалось обнаруживать текст, следующий за символом @, и прекращать обнаружение, когда он попадает в пробел. Это было прекрасно сделано с помощью 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, чтобы он ссылался на ПОСЛЕДНЕЕ вхождение символа @, потому что сейчас у меня есть ссылка только на первый символ @.
Это также может быть связано с тем, как я обнаруживаю пробел, чтобы знать, что пользователь закончил вводить имя пользователя и не нуждается в дополнительных предложениях.
Надеюсь, это поможет, спасибо!