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 リクエスト遅れ、完了リストがユーザー入力の 2 文字ごとにしか表示されないことです。

私は狂った男のようにGoogleとSOを検索しようとしましたが、解決策が見つからないようです..

どんな助けでも大歓迎です。

4

2 に答える 2

9

boolean プロパティの 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 に答える