2012-01-06 12 views
0

私は1つのウィンドウに3つのビューを持っています。そのうちの1つは、私がカスタマイズして何かを描画するためのビューです。このビューはこのウィンドウのfirstResponderです。ビューを切り替えるとacceptsFirstResponderが2度呼び出されるのはなぜですか?

このアプリケーションをビルドして実行すると、このビューに戻ると、acceptsFirstResponderメソッドが2回呼び出されてしまい、混乱します。なぜそのメソッドは追加の時間が呼び出されますか?何か案は?

+0

なぜ気になりますか? 'acceptsFirstResponder'メソッドで何をしていますか? –

+0

何か理由はありませんが、私は内部の詳細を知りたいだけです。このメソッドに何かを追加すると、何かが2回実行されます。それは恐ろしいかもしれません。 –

+0

このメソッドで行うべきことは、 'YES'または' NO'だけです。 'becomeFirstResponder'をオーバーライドする必要があるかもしれませんが、それは複数回呼び出されますか? –

答えて

3

これはAppKitがビューの仕組みを理解するために使用するコールバックです。このようなメソッドが呼び出される頻度や頻度は決して決定しないでください。

何度も呼び出されているのがなぜ好奇心であれば、メソッド内にブレークポイントを置くことで推測できます。ブレークポイントにヒットしたら、バックトレースを見て、スタックの上位にあるAppKitメソッドの名前を確認します。例えば

、この明らかに不自然な例と同様のAppKitのコードを想像:コードは、[ビューacceptsFirstResponder]を2回呼び出す

- (void)_syncFirstResponderStatusOfView:(NSView *)view withWindow:(NSWindow *)window { 
    if ((view == [window firstResponder]) && ![view acceptsFirstResponder]) { 
     // Perhaps the view changed its mind about accepting first responder 
     [window _makeFirstResponder:nil]; 
    } else if ((view != [window firstResponder]) && [view acceptsFirstResponder]) { 
     [window _makeFirstResponder:view]; 
    } 
} 

こと。ある関数でチェックされている値を想像することもできます。その結果に基づいて、ビューは別の関数に渡されます。これは複数のコードパスを介して入力することができ、それ。

関連する問題