7

この質問は簡単に思えますが、考えられることはすべて試し、何時間もグーグル検索しました。

基本的にAppleのSearchFieldサンプルコードをコピーして、オートコンプリートを行うNSSearchFieldがあります。ユーザーがテキスト入力を完了するまで検索を実行したくないため、IB で「検索文字列全体を送信」をオフにしました。

ユーザーがフィールドに入力し、Enter キーを押して、現在のオートコンプリートを受け入れるように指定すると、NSSearchField のアクションが起動します。代わりに、オートコンプリートを埋めるだけのように見えます。その後、ユーザーはアクションを実行するためにもう一度 Enter キーを押す必要があります。基本的に、Safari で URL の入力を開始すると、オートコンプリートが行われ、Enter キーを押すとページの読み込みが開始されます (アクションが開始されます)。ページの読み込みを開始するためにもう一度 Enter キーを押す必要はありません。

私が成功せずに試したこと:

  • control:textView:commandSelector:、insertNewline: を探しています。オートコンプリートを終了するためにエンターを押しているときに起動されません
  • controlTextDidEndEditing: をオーバーライドしています。同上

何か案は?ありがとう!

4

1 に答える 1

7

これを機能させる方法を見つけました。

NSTextViews の NSFieldEditor をオーバーライドする必要があります。

オーバーライドされたバージョンを提供するには、NSWindow のデリゲートで次のようにします。

- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)client
{
    if ([client isKindOfClass:[NSSearchField class]])
    {
        if (!_mlFieldEditor)
        {
            _mlFieldEditor = [[MLFieldEditor alloc] init];
            [_mlFieldEditor setFieldEditor:YES];
        }
        return _mlFieldEditor;
    }
    return nil;
}

_mlFieldEditor はインスタンス変数です。定義は次のとおりです。

@interface MLFieldEditor : NSTextView
@end

@implementation MLFieldEditor


-  (void)insertCompletion:(NSString *)word forPartialWordRange:(NSRange)charRange movement:(NSInteger)movement isFinal:(BOOL)flag
{
    // suppress completion if user types a space
    if (movement == NSRightTextMovement) return;

    // show full replacements
    if (charRange.location != 0) {
        charRange.length += charRange.location;
        charRange.location = 0;
    }

    [super insertCompletion:word forPartialWordRange:charRange movement:movement isFinal:flag];

    if (movement == NSReturnTextMovement)
    {
        [[NSNotificationCenter defaultCenter] postNotificationName:MLSearchFieldAutocompleted object:self userInfo:nil];
    }
}

@end

重要な部分は、[super insertCompletion...] の後の NSReturnTextMovement です。

最初の部分は、スペース キーを入力してもオートコンプリートが実行さ れないように変更します。

于 2011-03-19T06:18:48.793 に答える