今回は、アバウトウィンドウへのボタンや画像の配置、ボタンとアクションのリンク、記述したソースコードの解説などを行います。また、練習用に追加した不要なソースコード部分を外す処理も行います。
About.nibファイルに登録したAboutウィンドウは、そのままでは空っぽなので、お気に入り画像やコピーライ文字列、そしてウィンドウを閉じるときに使う「OK」ボタンなどを配置します。まずウィンドウを選択し、インスペクタのIdentityのClassをNSWindowのサブクラスである「NSPanel」に変更しておきます。続いてAttributeの方に戻り、使わない「Resize」や「Minimize」のチェックを外します。Titleの下の「Frame Name」に何らかの名称を代入しておくと、そのウィンドウをオープンした位置が自動で記憶されますが、アバウトはいつもスクリーンの中心に表示させる予定なので、このカラムへの名称代入は必要ありません。
まずは画像です。先んじてAboutに表示したいJPEG画像ファイルを用意して、Xcodeの ShinbunShi3プロジェクトの「Resources」グループに登録しておきます。本サンプルでは、Koike.jpg、About.jpg、Symmetry.jpgといった画像ファイルが用意されています。そうすると、これらの画像アイコンがInterface Builderのライブラリの「Media」タブに表示されますので、ここからドラッグ&ドロップでAboutウィンドウへ配置します。もし表示画像に枠が必要なら、インスペクタのAttributesで「Border」の種類を選択できます。これらの画像は最終的にはアプリケーションパッケージのResourcesフォルダに格納され、nibファイルからアクセスされることになります。
ボタンの配置は簡単です。Interface Builderのライブラリを「Objects」タブに切り替え、そこからボタンオブジェクトをドラッグ&ドロップで好みの位置に配置したら、インスペクタのAttributesのTitleに「OK」を代入します。Carbonで、Returnキーを押す事で反応するデフォルトボタンを作るのには、AttributesのTypeを「Default」に設定すればOKでした。しかし、Cocoaのボタンではそれに準じる設定がありません。どうすれば良いのかとしばらく悩んだのですが(笑)「Key Equiv.」にReturnキーを入力すれば良い事に気がつきました。これで表示も青色に変わります。つまり、Carbonで言うところのCancelボタンであれば、ここにEscキーを入力しておけば良いわけです。
続いて、OKボタンのアウトレットをFile's Owner(AboutController)の_okButtonに設定(リンク)する作業と、 ボタンのターゲット・アクション(押されたときに実行されるメソッド)をAboutcontrollerのcloseAbout:に設定する作業を行います。リンク対象となるアウトレットはAboutcontroller.hに記述されている...
IBOutlet id _okButton;
です。Carbonで言えば、そのボタンのControlRefがこの変数に代入されると考えればOKです。ターゲットアクションの方は、Aboutcontroller.hに記述されている...
- (IBAction)closeAbout:(id)sender
です。 Carbonの場合には、ボタンにcommand(OSType)を設定でき、Carbon Eventでそれを判別することでターゲットとなる処理ルーチンを実行するのですが、Cocoaでは、そのルーチンを直接ボタンに教え込む事ができると考えれば良いでしょ。さっそくリンク作業を行ってみます。
OKボタンを選択してインスペクタを表示します。ConnectionsのSent Actionsにある「selector」の右端の丸をドラッグします。すると「青い線」が表示されますので、引き延ばしてその先頭をFile's Owner(青い立方体)アイコンに重ねます。そこでマウスを離すと、近くに「closeAbout:」と「showWindow:」という2つのメソッドが表示されますので、closeAbout:の方を選択します。これでアクションのリンクが完了しました。
続いて、File's OwnerのConnectionsを表示します。Outletsの「_okButton」から線を引いてウィンドウ上のOKボタンにリンクします。同様に、Outletsの「window」の方は、Aboutウィンドウのアイコンにリンクします。これで両アウトレットのリンクが完了しました。こうしたオブジェクト間の線によるリンクは、インスペクタからだけではなく、オブジェクトをControlキーを押しながらマウスクリックすることでも可能です。
上記のアウトレットやアクションのリンク作業は、About.nibファイルがXcodeのプロジェクトに登録されていないと行えません。また、 アウトレットのwindowをリンクし忘れると、 Aboutcontroller (WindowControllerのサブクラス)が自分の担当するウィンドウをnibファイルから読み込めなくなりますので(表示できない)注意してください。
ところで、今回用意した_okButtonアウトレットの実際の用途はありません(単にリンクの練習用)。また、 ウィンドウを閉じるアクションのcloseAbout:の方は、NSWindowクラスの以下のメソッドで代用できます。
- (void)performClose:(id)sender
これは、ファイルメニューの「閉じる」が選択された時のアクションでして、そのメッセージは現在のフロントウィンドウに渡たります。ですから、OKボタンのselecterアクションをこちらに変更すれば、closeAbout:とまったく同じ結果を得られます。このアクションへリンクするには、selecterからの線をFirst Responder(赤い立方体)アイコンの方へ延ばし、表示されたアクションの中からperformClose:を選択すればOKです。
そんな訳で、NSWindowControllerのサブクラスとして用意したAboutControllerクラスが不必要となりました。そこで、AboutControllerクラスを使わなくてもOKな様に、nibファイルとソースコードを若干修正します。まずは、About.nibのFile's OwnerのClassをAboutControllerからNSWindowControllerに変更し、続いてApplicationConroller.hの内容を...
@interface ApplicationConroller : NSObject
{
AboutController *_aboutController;
}
から
@interface ApplicationConroller : NSObject
{
NSWindowController *_aboutController;
}
へと修正します。そして次に、ApplicationConroller.mの内容を...
- (IBAction)openAboutWindow:(id)sender
{
if( ! _aboutController )
_aboutController=[[AboutController alloc] init];
[[_aboutController window] center];
[_aboutController showWindow:self];
}
から
- (IBAction)openAboutWindow:(id)sender // Aboutウィンドウを表示させるメソッド
{
if( ! _aboutController ) // アバウトウィンドウは最初に一度だけ作成される
{
_aboutController=[[NSWindowController alloc]
_aboutController initWithWindowNibName:@"About"];
// NSWindowControllerクラスのインスタンス化
// Aboutウィンドウを指定nibから読み込みNSWindowController管理下に
}
[[_aboutController window] center]; // Aboutウィンドウを中心位置へ移動
[_aboutController showWindow:self]; // Aboutウィンドウを表示する
}
へと修正します。最後にプロジェクトから、AboutController.hとAboutController.mを外し(削除)てしまえば、修正作業は完了です。
次回は、「しんぶんし 3」で必要とされるだろうデータ構造(モデル・オブジェクト)について考えてみます。基本的には、複数の画像ファイルを管理するのに必要とされるデータ構造です。本連載で作成したプロジェクトファイルは、MOSA Exchangeに順次アップロードされています。今回分の名称は「ShinbunShi3_08_01_25.zip」です。