8

有谁知道可以对 NSTextField 实现自动完成的任何类或库?

我试图让标准自动完成工作,但它是作为同步 api 制作的。我通过互联网上的 api 调用获得我的自动完成词。

到目前为止我所做的是:

- (void)controlTextDidChange:(NSNotification *)obj
{
    if([obj object] == self.searchField)
    {
        [self.spinner startAnimation:nil];
        [self.wordcompletionStore completeString:self.searchField.stringValue];

        if(self.doingAutocomplete)
            return;
        else
        {
            self.doingAutocomplete = YES;
            [[[obj userInfo] objectForKey:@"NSFieldEditor"] complete:nil];
        }
    }
}

当我的商店完成后,我有一个被调用的代表:

- (void) completionStore:(WordcompletionStore *)store didFinishWithWords:(NSArray *)arrayOfWords
{
    [self.spinner stopAnimation:nil];
    self.completions = arrayOfWords;
    self.doingAutocomplete = NO;
}

将完成列表返回到 nstextfield 的代码是:

- (NSArray *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index
{
    *index = -1;
    return self.completions;
}

我的问题是,这将始终落后 1 个请求,并且完成列表仅显示在用户输入的每个第二个字符上。

我试过像疯子一样搜索谷歌,但我似乎找不到任何解决方案..

任何帮助深表感谢。

4

2 回答 2

9

不要让布尔属性doingAutocomplete,而是让属性成为发出请求的控件。我们称它为 autoCompleteRequestor:

@property (strong) NSControl* autoCompleteRequestor;

因此,您将当前属性doingAutocomplete 设置为YES,而是存储对您的控件的引用。

- (void)controlTextDidChange:(NSNotification *)obj
{
    if([obj object] == self.searchField)
    {
        [self.spinner startAnimation:nil];
        [self.wordcompletionStore completeString:self.searchField.stringValue];

        if(self.autoCompleteRequestor)
            return;
        else
        {
            self.autoCompleteRequestor = [[obj userInfo] objectForKey:@"NSFieldEditor"];
        }
    }
}

现在,当您的 Web 请求完成后,您可以在存储的对象上调用 complete:。

- (void) completionStore:(WordcompletionStore *)store didFinishWithWords:(NSArray *)arrayOfWords
{
    [self.spinner stopAnimation:nil];
    self.completions = arrayOfWords;
    if (self.autoCompleteRequestor)
    {
       [self.autoCompleteRequestor complete:nil];
       self.autoCompleteRequestor = nil;
    }
}
于 2012-12-06T17:02:27.870 回答
-2

NSTextView 具有补全部分单词的功能。

查看此组件的文档。也许你可以在你的应用程序中切换到这个组件。

于 2012-12-02T03:08:39.767 回答