8

銘柄記号と名前を検索するために、iTunes の検索フィールドの動作を再現しようとしています。具体的には、検索フィールドに入力を開始すると、フィルタリングされたアイテムを含むポップオーバーが表示されます。ほとんどの場合、これは機能していますが、複製できないのは、ファーストレスポンダーの処理方法です ここに画像の説明を入力

3文字入力するとポップオーバーが表示されます。この時点で、NSSearchField はファーストレスポンダーのステータスを失うため、入力を続けることができなくなります。私が望む動作は、ポップオーバーが表示された後、矢印キーでアイテムをスクロールして入力を再開し、検索フィールドの最後の文字から続行する機能です。

私が試したのは、NSTextView のサブクラス化 (これを NSSearchField のカスタム フィールド エディターとして使用) とオーバーライドです。

- (BOOL)resignFirstResponder 

NO を返すだけで、ポップオーバーが表示されたら入力を続けることができますが、明らかに、ポップオーバー内の項目を選択することはできません。下向き矢印またはマウスダウンイベントが発生した場合にYESを返す次のことを試しました。

@interface SBCustomFieldEditor ()
{
    BOOL resignFirstRepond;
}
@end

@implementation SBCustomFieldEditor

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code here.
        resignFirstRepond = NO;
    }
    return self;
}

- (BOOL)resignFirstResponder
{
    return resignFirstRepond;
}

- (void)keyDown:(NSEvent *)theEvent
{
    if ([theEvent keyCode] == 125) {
        resignFirstRepond = YES;
        [self resignFirstResponder];
    }
    [super keyDown:theEvent];
}

- (void)mouseDown:(NSEvent *)theEvent
{
    resignFirstRepond = YES;
    [self resignFirstResponder];
}

これは mousedown イベントでは機能しますが、keydown イベントでは機能しません。さらに、ユーザーが入力を再開したときに、これは問題に対処しません。

助言がありますか?

4

1 に答える 1

0

その間に、簡単な修正を見つけました。テキスト ビューをサブクラス化し、実装し- (BOOL)canBecomeKeyViewます。そこには常に NO を返します。ポップオーバーが表示されるときに一度だけ呼び出されます。テキスト ビューはいつでも操作できます。

于 2014-06-21T09:31:47.720 に答える