第6章 デザインパターン | ||
ホーム | メール | |
目次 | < 前ページ 次ページ > |
MyClipプロジェクトを立ち上げてMainMenu.xib ファイルを開きます。
【Xcode 3.1の場合】
Text Viewを選択するコツとしては、Text Viewが配置されている所を2度に分けてシングルクリックするということです。おそらく1度目のクリックでScroll Viewが選択されると思います。そして次のクリックでText Viewが選択されます。この時に焦ってダブルクリックするとText Viewを通り越してText Viewにデフォルトで表示されている英文が選択されて作業がややこしくなります。必ず2度に分けてシングルクリックするようにしてください。なお、もし途中で訳が分からなくなった場合は、MyClipウィンドウのタイトルバーをクリックしてInspectorパネルのタイトルが「Window○○」に戻してから、前述の手順をもう一度行ってください。
作業を保存すれば、必ずしもInterface Builderを終了させる必要はありません。しかしマシンスペックに余裕を持たせておくことなどを考えると終了させても良いでしょう。 次回の起動に時間がかかるなどの理由で終了させたくない場合はMainMenu.xibウィンドウだけでも閉じておくことをおすすめします。MainMenu.xibウィンドウを閉じるとMyClipに関わるInterface Builderファイルはすべて閉じられます。これで、うっかりxibファイルを変更してしまう間違いもなくなります。なお、この状態ではInterface Builderは起動したままです。何かの拍子にInterface Builderがアクティブになった場合はインスペクタパネルとライブラリパネルが表示されます。しかしInterface Builderが非アクティブな場合には、この2つのパネルが表示されることはありませんのでジャマになることもないでしょう。
デリゲートの説明の続きに戻ります 前述の作業でも分かるとおりに 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メソッドに次のように強調表示されているコードを加えることにします。
- (void)awakeFromNib { [textView setDelegate:self]; }
さらにController.hの@interface行を次のように変更します。
@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での接続を解除する方法を一応示しておきます。なお、この解除の方法は普通の接続(アウトレットの接続)を解除する方法とまったく同じです。また、コーディングによる接続の解除はその接続のためのコードを削除するだけです。
目次 | < 前ページ 次ページ > |