またも、Cocoaでのターゲット・アクションの話を続けよう。デザインパターンの定義するCommandパターンからは少し離れていくが、Cocoaというアプリケーションフレームワークで、コマンドがどのように処理されているかを理解する事は、デザインパターンを議論する際にも無意味ではないだろう。また、ターゲット・アクションの考え方は、この後のChain of Responsibilityパターンや、Mementoパターンの説明のときにも、登場することになる。

今回取り上げるのは、Interface Builderでのターゲット・アクションの接続だ。

Interface Builderとは

突然登場したInterface Builderだが、これはMac OS Xでアプリケーションを作成する際に使われるアプリケーションの名前だ。現在のMac OS Xでは、OSのすべてのパッケージにApple製の開発環境が付属する。その開発環境には、たくさんのアプリケーションが含まれるが、メインとなるのは2つだ。1つは、統合開発環境であるXcode。もう1つが、GUIデザイナアプリケーションであるInterface Builderだ。

近年の、GUIを持ったアプリケーションを作成するための開発環境では、GUIデザイナの存在は必須だろう。たとえば、MicrosoftのVisual Studioにも、デザイナ機能が統合されている。ドローアプリケーションのような使い勝手で、ウィンドウ上にボタンやメニューを配置していける、あれだ。

Visual Studioではデザイナはソースコードエディタなどと統合されているが、Mac OS Xの開発環境では別アプリケーションとして独立している。

D&Dによる、ターゲットとアクションの接続

なぜ、Objective-Cとターゲット・アクションの話をしているのに、GUIデザイナアプリケーションが登場するのか? もちろん、これら2つの間に、深い関連があるからである。極端な話、ターゲット・アクション・パラダイムという考え方の1つの具現化がInterface Builderである、という言い方も出来るだろう。

簡単にInterface Builderの使い方を紹介しよう。まず、ウィンドウ上にボタンやポップアップメニューといった、ユーザインタフェースのボタンを並べる。これらが、アクションの送り手となる。

次に、アクションの受け手となるオブジェクトを作る。このオブジェクトはなんでもいいので、ルートクラスであるNSObjectを直接継承した、AppControllerというクラスを作っておく(ちなみに、このクラスはMVCアーキテクチャでいうところのコントローラになるので、Controllerという名前をつけている)。クラスを作ったら、インスタンス化を行う。そう。Interface Builderでは、オブジェクトのインスタンス化が行えるのだ。ウィンドウやボタンだけでなく、どんなオブジェクトでもインスタンス化出来る。

AppControllerはアクションの受け手なので、受け口となるアクションメソッドを追加しておく。これもInterface Builderで行える。サブクラスの作成とメソッドの追加という、クラスデザインが行える訳だ。

これで準備が整った。ウィンドウの上には、アクションの送り手がいる。アクションの受け手も用意した。あとは、これらをつなぐだけである。ここからが、Interface Builder最大の見せ場になる。

まず、ウィンドウ上のアクションの送り手、たとえばボタン、を選択しよう。そして、キーボード上のコントロールキーを押しながら、ドラッグをする。すると、ボタンから線が延びてくるのだ。その線を、アクションの受け手まで持っていきドロップする。すると、そのオブジェクトが持つアクションメソッドの一覧が表示されるので、選択して「Connect」ボタンを押す。これで、アクションの送り手と受け手を接続することができるのだ。

開発環境においても、このような直感的な操作を用意するところに、Cocoa環境の特徴というか凄みを感じる。

ソースコードではなくアーカイブ

Interface Builderについてあまり語られないが、この連載では重要になる事を1つ指摘しておこう。

Interface Builderでの作業結果は、.nibというファイルに保存される。このファイルには、ソースコードは「含まれない」。つまり、ウィンドウ上にボタンを配置したり、ターゲットとアクションを接続したりしたが、これらがソースコードに置き換わる訳ではないのである。

では何になるかと言えば、アーカイブになるのだ。ウィンドウ上にボタンを配置するという事は、言うなればインスタンス化を行っている訳である。また、アクションを接続する前には、AppControllerクラスをインスタンス化した。これらのインタスンスをシリアル化し、アーカイブしてファイルに保存したものが、.nibファイルな訳だ。

実際にアプリケーションに組み込んだときは、このアーカイブファイルを読み込み、デシリアル化して、インスタンスを再現する。これがInterface Builderでの作業結果だ。Visual Studioでのデザイナとは大きく異なるので、注意してほしい。

自由な接続は、ターゲット・アクションのおかげ

Interface Builderでは、もちろん、ドラッグ・アンド・ドロップによる直感的な接続が一番の特徴だ。これが実現できているのは、ターゲット・アクションが「任意のオブジェクト」の「任意のアクション」を呼び出すことができるためだ。接続先のオブジェクトが何であるかは、ほとんど気にしない。アクションを持っているのもならば何でもいい。そのアクションは、Interface Builder上で、どんどん追加することができる。実際、ソースコードには実装していないアクションも追加することができる。この場合、実行時に例外が発生してしまうのだが(この辺りは、次期バージョンのInterface Builderで改善されるようだ)。

今回は、ターゲットとアクションを指定した接続について紹介した。実はこれだけでは、Interface Builderのターゲット・アクション機能のまだ半分しか説明していない。残りの半分は、Chain of Responsibilityの項で紹介しよう。

提供:毎日キャリアバン ク

毎日キャリアバンクではITエンジニア出身のキャリアコンサルタントで形成する IT専門のチームを編成し、キャリアに応じた専任コンサルタントがご相談を承り ます。キャリアチェンジから市場価値の可能性、ご収入などの相談から面接のア ドバイスまでお気軽にご相談ください。求人情報誌や転職情報サイトなどで一般 に公開されていないような「急募求人案件」も随時ご紹介が可能です。まずはご 登録ください!