2011-05-20 8 views
4

は、私はNSTextField、適切なデリゲートを設定した(結果はsqliteのデータベースからプルされる)NSTextfield + NSMenuとファーストレスポンダ

自分autocomplementionシステムを実装しようとしています。 NSTextFieldの変更のテキストが、それはそれは正常に動作し- (void)controlTextDidChange:(NSNotification *)aNotification方法

を呼び出すたびに、この方法では、私は私がそのコードでそれを表示する/呼び出すprogramtically、最終的にメニューを構築:

addressがある
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]; 

私のNSTextFieldmenuは私のNSMenuです。 問題はメニューにフォーカスが当てられているため、テキストフィールドに1文字しか入力できないため、メニューが最初のレスポンダになったのでもうテキストを入力できなくなります。

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

実際にはSafariやChromeのアドレスバーに似ているはずです。

答えて

3

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

+0

私は既にNSMenuを破棄してTableViewビューを使用しています。問題は、私がfirstResponderをTableViewに渡すと、テキストフィールドにもう文字を入力できなくなるということです。解決策は、矢印のみをTableViewに転送し、適切なアクションを実行することです。 – Dimillian

0

mgorbachが述べたように、NSMenuでは実際には可能ではありません。 NSTableViewに切り替えてテキストフィールドをカスタマイズしました。テキストフィールドは、上向き矢印と下向き矢印をテーブルビューに転送します。