3

簡単なオーディオ フェーダーを実装しようとしています。それに応じてグラフィックスを描画できるように、NSSlider と NSSliderCell をサブクラス化しました。

Cmd キーが押された状態でハンドルがクリックされるたびに、スライダーが定義された位置にジャンプするようにします。これは、ほとんどのオーディオ アプリケーションで非常に一般的です。

スライダーへの値の設定は問題なく機能していますが、アクション メソッドを呼び出して、値が変更されたことをターゲットに通知しません。これは、「スーパー」の mouseDown イベント処理のどこかで、おそらく NSControl で発生しているに違いありません。これは私がこれまでに得たものです:

- (void) mouseDown:(NSEvent *)theEvent
{
    if ( ([theEvent modifierFlags] & NSCommandKeyMask) > 0)
        [self setFloatValue:100.0f];
    else
        [super mouseDown:theEvent];
}

有望に見える NSControl ドキュメントでメソッドを見つけました。

-(BOOL)sendAction:(SEL)theAction to:(id)theTarget Parameters : 

theAction : ターゲットで呼び出すセレクター。セレクターが NULL の場合、メッセージは送信されません。

theTarget : メッセージを受信するターゲット オブジェクト。オブジェクトが nil の場合、アプリケーションはメッセージを処理できるオブジェクトをレスポンダー チェーンで検索します。アクションのディスパッチの詳細については、NSActionCell のクラスの説明を参照してください。

しかし、セレクターがどのような名前になるかはわかりません。ターゲットはおそらく超?

どんな助けでも大歓迎です!!

一番、

フロー

4

2 に答える 2

2

私は自分で答えを見つけました。@rdelmar の回答も機能する可能性がありますが、アクション メソッドの名前を変更すると機能しなくなります。

アクションメソッドを手動でトリガーする普遍的な方法を見つけました:

- (void) mouseDown:(NSEvent *)theEvent
{
    if ( ([theEvent modifierFlags] & NSCommandKeyMask) != 0)
    {
        [self setFloatValue:100.0f];
        [self.target performSelector:self.action withObject:self];
    }
    else
        [super mouseDown:theEvent];
}
于 2012-10-05T12:20:31.247 に答える
2

アクションは、スライダーに既に使用しているアクション メソッドの名前である可能性があり、ターゲットは、そのメソッドが実装されているクラス インスタンスである必要があります。したがって、たとえば、sliderReport: というスライダーに接続されたアプリ デリゲートに IBAction がある場合は、次のようにします。

[self sendAction:@selector(sliderReport:) to:[NSApp delegate]];

追加の注意: あなたの質問から、スライダーに接続したのと同じ IBAction を呼び出したいと思いましたが、必要に応じて別のセレクターを送信できます。スライダーの値がどのように変更されたかを区別する必要がある場合は、別の方法が適しています。任意の名前を付けることができます (最後にコロンを付けて、必要に応じて送信者引数としてそれ自体を送信できます)。

于 2012-10-04T21:02:41.520 に答える