0

カスタム ビューによってネストされたNSTextFieldがあり、テキスト ノード MindNode (下の画像を参照) の動作と同様に、連続した複数のクリック (ダブル クリック、トリプル クリックなど) のデフォルトの動作を変更したいと考えています。

最初のクリックでテキスト フィールドを「アクティブ化」してから、最初から続行します (イベントのクリック数をリセットするなど)。

次のアイデアがありますが、それらを実装する方法と、実際に意味があるかどうかはわかりません。

  • どういうわけか時間を使用して変更+[NSEvent doubleClickInterval]し、2 回目のクリックを遅くします。
  • プログラムでクリック数を減らしますか?
  • を使用して NSTextField を選択不可-hitTest:にし、クリックをスーパービューに転送し、テキスト フィールドのパラメータを変更して、次のクリックを受け入れます。この場合、2 回目のクリックのクリック数は 2 のままです。
  • オーバーライド-mouseDown:し、super を呼び出さないでください。これにより、NSTextField の選択機能が壊れます。

私が見落としていた、これを達成するためのより簡単な方法があることを願っています。

回答ありがとうございます。

以下は、問題をグラフィカルに表現したものです。 NSTextField の複数回クリックの動作を変更する

4

2 に答える 2

0

NSTextFieldプログラムでマウスダウンイベントのクリック数をサブクラス化してデクリメントすることで解決しました。サブクラスのブールプロパティを使用して、この特別な動作のオンとオフを切り替えることができます。

- (void)mouseDown:(NSEvent *)theEvent
{
    if (self.specialBehavior) {
        theEvent = [NSEvent mouseEventWithType:theEvent.type
                                      location:theEvent.locationInWindow
                                 modifierFlags:theEvent.modifierFlags
                                     timestamp:theEvent.timestamp
                                  windowNumber:theEvent.windowNumber
                                       context:theEvent.context
                                   eventNumber:theEvent.eventNumber
                                    clickCount:theEvent.clickCount - 1
                                      pressure:theEvent.pressure];
    }

    [super mouseDown:theEvent];
}

この長いメソッド呼び出しを単純化するためNSEventに、イベントのクリック数を減らすカテゴリメソッドを作成しました。

于 2012-10-06T13:16:51.927 に答える
0

これを行うには、テキスト フィールドとカスタム ビューを NSBox に埋め込みます。NSBox はカスタム タイプに設定され、最初は背景色や境界線がありません (非表示になります)。最初は、カスタム ビューが一番上にあり、最初のクリックを受け取る mouseDown: メソッドがあります。その方法では、ボックスのサブビューを再配置して、テキスト フィールドが一番上になり、次のクリックを受け取るようにすることができます。必要に応じて、ボックスをテキスト フィールドよりも少し大きくして、テキスト フィールドの周りにカスタム アクティベーション リングのように見える背景色またはその他の描画を与えることができます。テキスト フィールドの controlTextDidEndEditing: メソッドで、システムを最初の状態にリセットして、次にクリックするときに備えておくことができます。

編集後: オーバーレイ クラスで使用しているコードは次のとおりです。

@implementation Overlay

static NSComparisonResult rdComparator( NSView *view1, NSView *view2, void *context ) {
    if ([view1 isKindOfClass:[NSTextField class]])
        return NSOrderedDescending;
    else if ([view2 isKindOfClass:[NSTextField class]])
        return NSOrderedAscending;
    return NSOrderedSame;
}


-(void)mouseDown:(NSEvent *)theEvent {
    self.box.fillColor = [NSColor redColor];
    NSView *contentView = self.box.subviews.lastObject;
    [contentView sortSubviewsUsingFunction:rdComparator context:nil];
}
于 2012-10-01T22:24:48.467 に答える