7

NSView に編集不可、選択不可の NSTextView があります。テキスト ビューがクリックされたときにクリック イベントを受け取るには、NSView が必要です。基本的には、テキスト ビューが存在しないかのように動作するクリック イベントが必要です。明らかに、私はただ使用します

textView:clickedOnCell:inRect:atIndex:

テキスト ビューのデリゲート メソッドを使用していますが、クリック イベントをキャプチャして、ダブルクリックなどを検出する必要があります。

4

2 に答える 2

8

テキスト ビューを含むビューでhitTest:メソッドをオーバーライドして return にしselfます。その後、マウス イベントがコンテナー ビューに送信されます。

警告

それ以来、ウィンドウ内の任意の場所hitTest:でクリックおよびマウス トラッキング イベントが呼び出されることを発見しました。これは、コンテナ ビューの近くには本来存在しないイベントであっても同様です。ウィンドウに他のビューがある場合、メソッドはコンテナー ビューをブラック ホールに変えます。これにより、それらのすべてのイベントがそれ自体に引き寄せられ、他のビューからは決して見えなくなります。hitTest:

そのための修正は、イベントを飲み込む前に、イベントがビュー内にあるかどうかをテストすることです。そうであれば、戻りselfます。そうでない場合は、を返しnilます。

これを行う最も簡単な方法は、superの実装を呼び出すことです。これは、ポイントがビュー内にある場合はビューまたはそれ自体のサブビューを返しself、そのメソッドが非を返した場合は単に戻りnilます。が返された場合nil、あなたも を返しnilます。

それほど単純ではありませんが、おそらくより効率的な方法は、ポイントをウィンドウの座標系からビューの座標系に変換し、 を使用NSPointInRectしてポイントがビューの 内にあるかどうかをテストすることboundsです。

于 2011-08-20T18:24:39.220 に答える