我正在查看NSTokenField, NSTextField和NSTextView,没有运气做以下事情:
我正在写一个推特客户端,当你想推特一个新的推特,然后你开始写一个文本字段,例如:
Going to make coffee, @pe
当你开始写一个@
然后我想帮助用户自动完成用户名,例如@peter
。我有一个用户名为
NSArray *usernames = [NSArray arrayWithObjects:@"@andreas", @"@clara", @"@jeena", @"@peter"]
我应该怎么做才能启用一个简单的自动补全?如果你也需要按F5或者其他什么,我会很高兴的。我遇到的问题是,与NSTokenField我不知道我应该如何标记字符串,与NSTextField它只工作当我写@用户名在推文的开始和NSTextView似乎真的很复杂,太多了这样一个简单的事情。
最基本的实现包括重写这个方法…当然不是最优的,但你应该明白:
- (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","Hell"…重复你字典里的每一个单词。那样快多了。
如果你想支持自动完成,只需调用'complete:'方法当你检测到文本在你的控件中改变。