1

コントロールがフォーカスを取得したら、いくつかのオプションを含むまたはメニューをNSTokenField表示するようにサブクラス化しようとしています。NSPopover残念ながら、数日間の暫定的な後、私はそれが不可能だと考え始めています.

これが私がこれまでに試したことです:

  • -textDidBeginEditingとは-controlTextDidBeginEditing、ユーザーが最初の文字を入力した後にのみ呼び出されるため、役に立ちません。フォーカスで起動するものが必要です。
  • メニューまたはポップオーバーをオーバーライド-becomeFirstResponder-resignFirstResponderて表示および非表示にすることも役に立ちません。tokenfield は明らかにファーストレスポンダーのステータスをプライベート ビュー ( NSTokenFieldView) に渡すため、メニューまたはポップオーバーを閉じた-resignFirsttResponder直後に呼び出されます。-becomeFirstReponder
  • -currentEditorのメニューを閉じる前にの値を監視してみました-resignFirstResponder。コントロールが編集モードの-currentEditorときは非 nil である必要がありますが、残念ながらその値は-resignFirstRespondertokenfield が呼び出された後にのみ設定され、もう一度メニューがすぐに閉じられます。
  • メソッドをサブクラス化しNSTokenFieldCellてオーバーライドしよう-editWithFrame:-selectWithFrame:しましたが、カスタムのトークンフィールドNSTokenFieldCellはまったく表示されず、エラーや例外も報告されません。

これを行う方法について何か考えはありますか?誰かがやったことがありますか?

4

1 に答える 1

2

これは機能します。firstResponder親ウィンドウのプロパティを観察することでそれを行いました。トークン フィールドまたはそれに含まれるNSResponderいずれかがファーストレスポンダーになると、ポップオーバーが表示されます。

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    [ self.window addObserver:self forKeyPath:@"firstResponder" options:NSKeyValueObservingOptionNew context:nil ] ;
}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ( object == self.window && [ keyPath isEqualToString:@"firstResponder" ] )
    {
        NSResponder * responder = [ change valueForKey:NSKeyValueChangeNewKey ] ;

        while ( NULL != responder )
        {
            if ( responder == self.tokenField )
            {
                // show popover (if not showing)
                NSLog(@"Show popover!\n") ;
                return ;
            }
            responder = responder.nextResponder ;
        }

        NSLog(@"Hide popover!\n") ;
    }
    else
    {
        [ super observeValueForKeyPath:keyPath ofObject:object change:change context:context ] ;
    }
}

@end
于 2012-09-02T07:06:47.563 に答える