Cocoaで気づいた点を箇条書き。
つまり、息子と遊びほうけているだけじゃなくてプログラミングの勉強もしていますよアピールの記事です。というわけで興味のない方は無視してくださいな。
2009/1/28追記:delegateはNSControl経由で呼ばれていることが判明。なので実装するメソッドもcontrolからのメソッドとして書かないといけない。
なぜNSTextFieldから直接呼ばれるのではなくNSControlを経由するかという理由はここに書いてあった。つまり、複数のNSTextFieldのdelegateを持っているときに、どのオブジェクトからのメッセージかを明確にするため、だそうで(意訳なので不安)。
テキストフィールド(NSTextField)のdelegateをオブジェクトと接続しておくと、少なくとも
- テキストへの入力開始:control:textShouldBeginEditing
- テキストフィールドへの入力終了(改行やフォーカスアウトなど):control:textShouldEndEditing
のタイミングで各メソッドが呼ばれます。他にもあるけれど、それはマニュアルを読めば分かるのでここでは置いておきます。
あと、実行中動的にdelegateに対して何が投げられるかをチェックしたい場合は、そのオブジェクトに以下のコードを埋め込んでおけばOK。すると何かdelegate経由で呼ばれるたびにコンソールにメソッド名を出力してくれるので、理解が進んで良い感じ。
- (BOOL)respondsToSelector:(SEL)aSelector
{
NSString *methodname = NSStringFromSelector(aSelector);
NSLog(@"respondsToSelector:%@", methodname);
return [super respondsToSelector:aSelector];
}
※先日購入した洋書:「Cocoa Programming for Mac OS X」のp.109に載っていたコードです。
・・・それにしても、Objective-Cのdelegateの仕組みって優れているなと改めて思います。Javaのインタフェースだと、インタフェースに宣言されているメソッドを全て実装しなければならないのに対して、delegateは必要なものだけ実装すれば良いわけで(メソッド呼び出しが無視される)。
delegateの「実装していないから無視するよ」というのは静的言語の一般概念からすると有り得ないくらいの自由を与えてくれる仕組みですね。
※ちなみにJavaのインタフェースと同じように、メソッドの実装を義務づけたい場合はプロトコル(Objective-C2.0だと@required相当)を用いれば良いです。
では!
最近のコメント