mouseEnter, mouseLeave のイベントを捕まえるためには、そのview(NSBottun
とかNSTextFieldも)の
addTrackingRect:owner:userData:assumeInside:
をはじめに呼んでやる必要があります。下のような感じです。
NSTrackingRect *trackingRect;
--------
trackingRect = [self addTrackingRect:[self bounds] owner:self
userData:NULL assumeInside:NO];
でもしそのボタンなりフィールドを含むウィンドウがサイズ変更をする場合はそ
の度に、上の trackingRect を更新する必要があります。
[self removeTrackingRect:trackingRect];
trackingRect = [self addTrackingRect:[self bounds] owner:self
userData:NULL assumeInside:NO];
僕が参考にしたHPは以下です。
http://xcatsan.blogspot.com/2008/02/blog-post_3361.html
> 少し疑問だったのは,addTrackingRect:owner:userData:assumeInside:はNSViewで提供されているメ
> ソッドなので,GUIコンポーネントはNSViewを継承しているからよいのですが,NSResponderを直接継承してmouseDown:イベン
> トを受け取り場合などはどうするんでしょうね?単にNSResponderを継承し,delegateとかすればよいのですかね?
僕の理解している所では、画面上にあらわれるGUIの部品はたいてい、NSWindow
かNSViewのどちらかを継承することになると思います。NSResponderはその両方
にイベント処理の枠組みを提供するための、abstractなclassと位置づけられて
いるんだと思います。だからGUIの部品であればそこから直接継承するよりも、
上記二つのものから継承するのが簡単ということじゃないですか?> 百舌鳥さん
> ・Cocoaでは,Actionに登録できるセレクタは1
> つで,イベントごとに異なるセレクタを登録できる仕組みは用意
> していない.
> ・仮にActionに設定したセレクタ以外で個々のイベントを
> 取得するには,NSViewを継承するコンポーネントを継承
> し,独自クラスを作成してなん
> とかするしかいない.
action は任意のイベントを拾うような仕組みではないです。一般的
なイベントに関しては、delegate, notification, binding
等が用意されている場合、サブクラス化は不要です。
マウスのトラッキングですが、
最初のメールでは「mouseEntered: を実装したが呼ばれな
い」という話でしたが、逆にそれだけで動くなら、それは普段から
デフォルトの mouseEntered: 呼ばれているということにな
り、非常に重い物になってしまうと思います。
> ということになりますかね.
最初に「Cocoa では」と断られていますが、他の環境では
mouseEntered: に対応する部分を実装するだけでマウス移動のイベ
ントが拾えるようなものがあるということでしょうか。もしそうな
ら参考までに教えていただけると。
> 少し疑問だったのは,addTrackingRect:owner:userData:assumeInside:
> はNSViewで提供されているメ
> ソッドなので,GUIコンポーネントはNSViewを継承し
> ているからよいのですが,NSResponderを直接継承して
> mouseDown:イベン
> トを受け取り場合などはどうするんでしょうね?単に
> NSResponderを継承し,delegateとかすればよいのですかね?
NSResponder に関しては responder chain というものがあり
ます。
一般的な Cocoa の UI のオブジェクトは自分を含む
NSView がいるのでそれにお願いするという手があると思います。
Yanagisawa
僕が現在作成中のアプリは韓国語動詞活用の練習ソフトでして、動詞と語尾を結
びつけて正しい活用形をつくりだす練習のためのツールです。で、正しい活用形
(解答)を表示するNStextFieldを用意しているんですが、それは普段は表示され
ず、表示表示を切り替えるボタンを別に用意しています。そのボタンをクリック
するとそのtextFieldの表示非表示がトグルするようにしています。
ただ一時的に答えを確かめたいという時にはボタンの上にマウスを近づけた時だ
けそのtextFieldが表示されるという動作を追加していて、その時に、
mouseEnter, mouseExitedのイベントを拾って使用しています。toolTipは若干動
作が遅くてこの方がいいかなと思っています。