【问题标题】:Autocomplete with twitter usernames in text field (cocoa)在文本字段中使用 twitter 用户名自动完成(可可)
【发布时间】:2011-10-03 16:30:35
【问题描述】:

我正在查看 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 似乎真的很复杂,对于这样一个简单的东西来说太多了东西。

【问题讨论】:

    标签: macos cocoa autocomplete nstextfield nstokenfield


    【解决方案1】:

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

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

    如果您想支持自动完成,只需在您检测到控件中的文本发生变化时调用“完成:”方法即可。

    【讨论】:

    • 有没有办法只在文本视图内显示第一个匹配内联而不显示其他结果列表?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2010-10-15
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多