Автозаполнение с именами пользователей Twitter в текстовом поле (какао) - PullRequest
4 голосов
/ 03 октября 2011

Я смотрел на NSTokenField, NSTextField и NSTextView безуспешно, чтобы сделать следующее:

Я пишу клиент Twtitter, и когда вы хотите добавить в Твиттер новый твит, вы начинаете писать в текстовом поленапример:

Going to make coffee, @pe

Когда вы начнете писать @, я хотел бы помочь пользователю автоматически заполнить имя пользователя, например @peter.У меня есть NSArray с именами пользователей, такими как:

NSArray *usernames = [NSArray arrayWithObjects:@"@andreas", @"@clara", @"@jeena", @"@peter"]

Что я должен сделать, чтобы включить простое автозаполнение?Я был бы рад, если бы вы нажали F5 или что-то еще для начинающих.У меня проблема в том, что с NSTokenField я не знаю, как мне следует токенизировать строку, с NSTextField это работает только тогда, когда я пишу @username в начале твита, а NSTextView кажется действительно сложным и слишком сложным для такого простоговещь.

1 Ответ

3 голосов
/ 16 декабря 2011

Самая базовая реализация включает в себя переопределение этого метода ... Определенно не оптимально, но вы должны понять:

- (NSArray *) completionsForPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index {
    // this would be defined somewhere else, but just for example.. 
    NSArray *usernames = [NSArray arrayWithObjects:@"@andreas", @"@clara", @"@jeena", @"@peter"];

    NSMutableArray *matchedNames = [NSMutableArray array];
    NSString *toMatch = [[self string] substringWithRange:charRange];
    for(NSString *username in usernames) {
        [matchedNames addObject:username];
    }

    return matchedNames; // that's it. 
}

Как только вы начнете иметь много данных, вам нужно будет использовать стратегиичтобы предварительно выполнить поиск, сохраняя слова в хешах с частичными частями текста в них (например, «Hello» будет помещен в 4 разных массива в клавиши NSDictionary для «H», «He», «Hel», "Ад" .. Повторите с каждым словом в лексиконе. Гораздо быстрее, таким образом.

Если вы хотите поддерживать автозаполнение, просто вызовите метод complete: при обнаружении изменения текста в вашемконтроль.

...