タイトル【今から始めるCocoaプログラミング】最初のアプリケーション(4)線で結びクラスを生成<続き>カテゴリーProjectBuilder/Interface Builder, 今から始めるCocoaプログラミング
作成日2000/12/19 10:42:38作成者新居雅行
ここで、デバッガを使いながら、プログラムの中での動作を検討していきたい。いろいろ作業をする前に、まず、Javaのデバッガを使えるように設定を確認してもらいたい。デバッガの種類はプロジェクトの設定で行なう。設定の確認はいろいろな方法があるが、ここではまず左側のファイル一覧の右にあるTargetsというタブを選択して、ターゲット設定を左側に項目として出した。そして、ここでは1つだけあるMyFirstCocoaというターゲットを選択すると、右側にはプロジェクトの設定が表示される。Executablesというタブを選択し、さらにDebubberというタブを選択し、表示されるJava Debubberのラジオボタンを選択しておく。特にOKなどのボタンはなく、ラジオボタンを選択するだけで設定は行なわれる。

◇デバッガをJava Debuggerを使用するに設定する
 

ここでソースを見てみよう。Project Builderの左側の表示をFilesにして、新たに作ったMyWindowController.javaを参照してみる。Outletがインスタンス変数、Actionがメソッドになっているのがすぐに分かるだろう。importしているのは、Cocoaのライブラリだ。後はJavaを知っている人にはすぐに判読できるプログラムだ。
このプログラムで、ボタンをクリックして呼び出されるclickButtonメソッドに、図にあるよう、printlnを含むステートメントを3行追加する。Outletに相当するObject型のインスタンス変数がいったい何ものなのかを調べるということをしたいわけだ。ちょっと大雑把なプログラムだが、結果オーライだ。これで、とりあえずConsoleに、オブジェクトの型が表示されるので、その結果を参照することにしたい。また、プログラムリストのいちばん左側に楔が見えているが、これはブレークポイントをします。この部分をクリックすることでブレークポイントを設定できる。

◇clickButtonに3行加える
 

では、実際に実行といきたいところだが、ここではまずカナヅチアイコンをクリックして、ビルドを行なう。このとき、保存していないファイルがあると次の図のように警告を出すので、Save Allボタンをクリックすればいいのだが、Interface Builder側で保存がなされていない場合にも、きちんと警告を出す。Interface Builder側でも通常の文書と同じように保存をしておかないといけないのである。

◇保存していないファイルがあると、警告を出す
 

ビルドを行なった後は、Project Builderのウインドウの上部に4つ並んでいるボタンのうち、デバッグ実行を示すスプレー缶ボタンをクリックする。すると、プログラムが実行し、新たにアプリケーションが起動して、そしてウインドウが表示される。さっそく、ボタンをクリックすると、さきほどブレークポイントで指定した箇所で実行がストップする。図では、最後のprintlnを実行するために、さらに1ステップ進んでみた。DebugメニューからStep Over(Command+shift+O)などのステップ動作があるが、メニューやキー操作以外に、ウインドウの右に表示されるボタンを利用してもステップ動作は可能だ。

◇ブレークポイントでストップしたところからさらに1ステップ進んだところ
 

ここで、右側の中段に、変数の値を表示するペインがある。そこで、階層表示を行なうと、This、つまり、MyWindowControllerそのもののインスタンス変数が下位の項目になるのだ。ここで、Interface Builderで結合していないOutletに対応するTextField2とTextField3については、nullになっている。つまり線で結んでいないOutletはとりあえず何も機能していないと考えることができる。
上部のConsole表示には、printlnでオブジェクト値をそのまま表示させてみた結果が表示されている。変数値、あるいはConsole出力によると、MyWindowControllerクラスのTextField1というインスタンス変数は、実は型としてはNSTextFieldになっている(このクラスのフルパスは、変数値で参照できる)。プログラム上は、Object型ではあるが、これはオブジェクトのジョーカーみたいなもので、どんな型でも扱えるようにするための措置と思えばよいだろう。そして、実態はNSTextFieldである。これは、Cocoaライブラリ、正確にはAppKitの中で定義されたユーザインタフェースコンポーネントである。
いずれにしても、Interface Builderで、クラスのOutletとコントロールを結び付けると、そのクラスの中ではOutletに対応したインスタンス変数が、ウインドウ上のコントロールを参照する。つまり、クラスの中で、ウインドウの中にあるコントロールを処理できるのである。コントロールをクラスの中に呼び込んでいると思ってもいいだろう。Interface Builderでの設定がプログラムの動作につながっている。

ここで、Cocoaのライブラリに明るくない人は、思わずフリーズするだろう。NSTextFieldって何やねん?? そこで次回は、ドキュメントを参照して、NSTextFieldの使い方に迫ってみたい。
関連リンク