4

我正在查看 NSTokenField、NSTextField 和 NSTextView,但没有执行以下操作:

我正在写一个 Twtitter 客户端,当你想在 Twitter 上发布一条新推文时,你就开始在文本字段中写入,例如:

Going to make coffee, @pe

例如,当您开始编写时,@我想帮助用户自动完成用户名@peter。我有一个 NSArray,其用户名如下:

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

我应该怎么做才能启用简单的自动完成功能?如果您也必须按 F5 或其他东西来启动,我会很高兴。我遇到的问题是,使用 NSTokenField 我不知道应该如何标记字符串,使用 NSTextField 它仅在我在推文开头写 @username 时才有效,而 NSTextView 似乎真的很复杂,对于这样一个简单的东西来说太多了事物。

4

1 回答 1

3

最基本的实现涉及覆盖此方法...绝对不是最佳的,但您应该明白:

- (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”的键.. 用你的词典中的每个单词重复。这样快得多。

如果您想支持自动完成,只需在您检测到控件中的文本正在更改时调用“完成:”方法。

于 2011-12-16T01:33:05.687 回答