5

独自の自動補完システムを実装しようとしています (結果は sqlite データベースから取得されます)

NSTextField と適切なデリゲートを設定しました。NSTextField のテキストが変更されるたびに、- (void)controlTextDidChange:(NSNotification *)aNotificationメソッドを呼び出します

このメソッドでは、プログラムでメニューを作成し、最後にそのコードで呼び出し/表示します。

 NSRect frame = [address frame];
NSPoint menuOrigin = [[address superview] convertPoint:NSMakePoint(frame.origin.x, frame.origin.y+frame.size.height-25)
                                                toView:nil];

NSEvent *event =  [NSEvent mouseEventWithType:NSLeftMouseDown
                                     location:menuOrigin
                                modifierFlags:NSLeftMouseDownMask // 0x100
                                    timestamp:0
                                 windowNumber:[[address window] windowNumber]
                                      context:[[address window] graphicsContext]
                                  eventNumber:0
                                   clickCount:1
                                     pressure:1]; 
[NSMenu popUpContextMenu:menu withEvent:event forView:address];

addressは私のもので、私NSTextFieldmenuものはどこですかNSMenu。問題は、メニューがフォーカスを取得するため、テキスト フィールドに 1 文字しか入力できず、メニューがファーストレスポンダになったため、テキストを入力できなくなることです。

私の質問は、メニューを表示し、テキスト フィールドをファーストレスポンダーとして保持して、フィールド内のテキストが変更されるたびにメニューがリロードされている間に入力できるようにする方法です。

たとえば、実際にはSafariやChromeのアドレスバーのようにする必要があります。

4

2 に答える 2

4

これが NSMenu で可能だとは思えません。NSMenu の実装は非常に低いレベルでシステムによって制御され、キーボード フォーカスを取得するように設計されています。必要なのは、メニューのように見える独自のビューまたはウィンドウを作成することですが、NSMenu を使用していません。たとえば、クロム アドレス バーのメニューが標準の NSMenu のように見えないことに注意してください。表示および描画し、コールバックまたは通知を受信して​​ユーザーの入力時に更新するビューを作成する必要がありますが、キーボード フォーカスは取得しません。ビューがファーストレスポンダーのステータスを受け入れるかどうかを制御する NSView (実際には NSResponder) にはメソッドがあります。

于 2011-05-21T09:12:18.930 に答える
1

mgorbach が述べたように、NSMenu では実際には不可能です。NSTableView に切り替えて、テキスト フィールドをカスタマイズしました。テキストフィールドは上下の矢印をテーブルビューに転送し、それは正常に機能します!

于 2011-05-23T14:40:59.727 に答える