viva Cocoa Objective-C 入門 第6章 デザインパターン
ホーム メール
 
目次 < 前ページ 次ページ >

デリゲートの接続

Interface Builderによるデリゲートの接続

 MyClipプロジェクトを立ち上げてMainMenu.xib ファイルを開きます。

 デリゲートの説明の続きに戻ります 前述の作業でも分かるとおりに Text Viewにはデリゲート(delegate)というアウトレット(インスタンス変数)がはじめから用意されています。またデリゲート先となるオブジェクトは、MainMenu.xibウィンドウの中にある“First Responder”以外のどのオブジェクトにも接続することができます。Cocoaフレームワークに最初から用意されている既存のオブジェクトでもプログラマが作成したオブジェクトでも接続することができます。メインウィンドウの中のScroll View やWindow自身にさえも接続できます。しかし今回MainMenu.xibウィンドウの中にあるオブジェクトの中で実際に私たちがコーディングすることができるのはControllerとMyClipAppDelegateだけです。ほかのオブジェクトでは接続はできてもそのオブジェクトにデリゲートメソッドをコーディングすることはできません。つまり、delegate先としては意味がないということになります。またMVCの観点からみても今回のdelegate先としてはControllerオブジェクトが適任ということになります。

【Xcode 3.1の場合】

 Text Viewの英文について

 この英文は当然のことながらInterface Builderで最初から削除しておき初期値として空文字に設定しておくこができます。しかし空文字にすると今度はText Viewをマウスで選択するのが難しくなります。そのためにデフォルトのままこの英文を残すことにしています。

コーディングによるデリゲートの接続

 デリゲートはInterface Builderを使わずにコーディングによって接続することもできます。コーディングで接続を行えばMainMenu.xibに含まれていなかったModelオブジェクトをText Viewのdelegateにすることもできます。また状況においてdelegate先を変更することも可能となります。この利用法としては同じトリガーメソッド(デリゲートメソッド)を状況において違う振る舞いにしたい場合などが考えらます。

 次のコードは、コーディングによるデリゲートの接続例になりますが、デリゲート先はやはりControllerオブジェクトにしています。ModelオブジェクトをText ViewのdelegateとすることはMVCの観点から見るとおかしいからです。なおこのコードを記述する場所はController.mのawakeFromNibが良いでしょう。

 今回の場合、MyClipAppDelegateのapplicationDidFinishLaunching:に記述しても良いというか、どちらかというとそのほうが理にかなっています。しかし次のコードのレシーバとなるテキストビューもデリゲート先として登録するControllerオブジェクトもInterface Builderを使用せずにMyClipAppDelegateから取得することはなかなかやっかいなことです。以上の理由により、ここではController.mのawakeFromNibメソッドに次のように強調表示されているコードを加えることにします。

Controller.m
- (void)awakeFromNib { [textView setDelegate:self]; }


さらにController.hの@interface行を次のように変更します。

Controller.h
	@interface Controller : NSObject <NSTextViewDelegate> {

■ コード説明

 Controller.mのawakeFromNibについては特に説明の必要はないと思います。もし説明する必要があるとすれば引数にselfを指定している点です。この場合selfはControllerオブジェクト自身を表しています。

 Controller.hにおいては、事は重大です。Appleは従来、非形式プロトコルで実現していたデリゲートメソッドを、すべて選択権付きプロトコルで実現することに方向転換したみたいです。プロトコルについては後の章で (補足資料で) 説明します。ここはとりあえずサンプルどおりにコーディングしてください。

【Xcode 3.1の場合】

 次のようにawakeFromNibの実行式の1行目にテキストビューを白紙にするメッセージ式も記述します。

- (void)awakeFromNib
{
    [textView setString:@""];
    [textView setDelegate:self];
}


 なお、Controller.hについてはXcode 3.2のように変更する必要はありません。デフォルトで記述されている次のコードのままにしておいてください。

@interface Controller : NSObject {

 このようにコーディングによる接続を行うか、あるいはInterface Builderで接続を行うかは読者の好みにお任せします。どちらの方法を使ったとしても今後の作業に変わりはありません。Interface Builderでの接続とコーディングによる接続がダブっていても特に問題は起こりません。Interface Builderでの接続先とコーディングによる接続先が違う場合はコーディングによる接続先が優先されます。しかしコーディングによる接続を選んだ場合、Interface Builderの接続を残しておくことは、害がないとはいえ気持ちが悪いことでしょう。そこでInterface Builderでの接続を解除する方法を一応示しておきます。なお、この解除の方法は普通の接続(アウトレットの接続)を解除する方法とまったく同じです。また、コーディングによる接続の解除はその接続のためのコードを削除するだけです。


■ Interface Builderでのデリゲートの接続解除



目次 < 前ページ 次ページ >


Copyright 2006 - 2010 viva Cocoa. All Rights Reserved.