8

NSTextFieldオートコンプリートのサポートを追加するために、次のデリゲートメソッドを実装しました。

- (NSArray *)control:(NSControl *)control
            textView:(NSTextView *)textView
         completions:(NSArray *)words
 forPartialWordRange:(NSRange)charRange
 indexOfSelectedItem:(NSInteger *)index

問題は、このメソッドが呼び出されないことです。他のデリゲートメソッドが正常に機能するため、のが正しく設定されているdelegateことを確認できます。NSTextField

4

1 に答える 1

7

complete:ある時点で、テキストフィールドのフィールドエディタで呼び出される必要があります。これが完了メニューのトリガーになりますが、自動的に呼び出されることはありません。F5が何にもバインドされていない場合は、フィールドに入力して、それを押してみてください。その後、完了がトリガーされます。Option-Escも機能する可能性があります。

オートコンプリートが必要な場合は、多少の作業が必要です。次のようなものから始めることができます。

- (void)controlTextDidChange:(NSNotification *)note {
    if( amDoingAutoComplete ){
        return;
    } else {
        amDoingAutoComplete = YES;
        [[[note userInfo] objectForKey:@"NSFieldEditor"] complete:nil];
    }
}

NSControlTextDidChangeNotificationトリガー完了が再度通知されるため、何らかのフラグが必要です。これにより、これが呼び出され、完了がトリガーされ、制御テキストが変更されます。

明らかに、ある時点でフラグの設定を解除する必要があります。これは、ユーザーのオートコンプリートとのやり取りをどのように処理するかによって異なります。特定の開始文字列に対して1つの補完しかない可能性が高いか、ユーザーが入力を続けて可能性を絞り込む必要があります(この場合、オートコンプリートを再度トリガーするには)?

単純なフラグでも、それがうまくいかない場合があります。通知は再投稿されますが、フィールドエディタstringは変更されていないようです。キーボードからの直接入力に応じてのみ変更されます。オートコンプリートの実装では、「最後に入力した文字列」のコピーを保持し、それを毎回フィールドエディタの内容と比較する必要があることがわかりました。

于 2011-04-02T20:03:25.807 に答える