viva Cocoa Objective-C 入門 第5章 アプリケーションの初期化
ホーム メール
 
目次 < 前ページ 次ページ >

レスポンダチェーン

ファーストレスポンダ


■ ファーストレスポンダ

 まず次の図を見てください。Interface BuilderのMainMenu.xibウィンドウの中に“First Responder”というオブジェクトがあります。

図 MainMenu.xibウィンドウ - First Responder

 このオブジェクトはアプリケーションが起動中に、ユーザからのマウス操作やキーボート操作などのイベントを最初に受け取るオブジェクトを表しています。通常、イベントに応じられるオブジェクトはアプリケーションの起動中に刻々と変わっていくことになります。このFirst Responderはその変化にあわせて指し示すオブジェクトを変更します。


■ 代理オブジェクト

 前述の説明に少し違和感を覚えた方もおられるかもしれません。実はMainMenu.xibウィンドウの中で“File’s Owner”、“First Responder”、“Application”の3つはMainMenu.xibファイルに含まれている(登録されている)オブジェクトではありません。前節の「Xcode 3.1の場合は」でFile’s OwnerからMyClipAppDelegateに接続をおこなったように、オブジェクトの接続などのために便宜的にMainMenu.xibウィンドウに表示されているだけです。このように本当はxibファイルに含まれていないオブジェクトのことを代理オブジェクト(proxy object)と呼び、xibファイルに本当に登録されているオブジェクトと区別しています。First Responder以外の代理オブジェクトの働きは次のようになります。

・File’s Owner
 そのxibファイルのオーナー(所有者、管理者)であるオブジェクトを表しています。オーナーですから当然xibファイルの中に含まれているということはあり得ません。またMyClipのようなシングルトンアプリケーションの場合はNSApplicationがxibファイルのオーナーになることが決まっていますが、複数のメインウィンドウ(ドキュメントウィンドウとも言います。詳しくは後の章で説明します)を持つアプリケーションの場合には、このFile’s Ownerが指し示すオブジェクトは刻々と変わっていくことになります。なお前述のようにMyClipのFile’s Ownerは常にNSApplicationです。したがって前節ではNSApplicationオブジェクトからMyClipAppDelegateへ接続をおこなっても結果は同じで問題が起こることもありません。しかしこのような場合でも慣習的にFile’s Ownerから接続をおこなうことになっています。
・Application
 前節でも説明しようにアプリケーション全体を管理するオブジェクトです。したがってこのオブジェクトもxibファイルに含まれているということはあり得ないことになります。またシングルトンアプリケーションではFile’s OwnerがNSApplicationを表すことになっていますが、複数のドキュメントウィンドウを持つアプリケーション(ドキュメントベースドアプリケーション)の場合にはFile’s Owner イコール NSApplicationとは限りません。したがってNSApplicationのデリゲート接続などのために、この代理オブジェクトが必要となります。

レスポンダチェーン

 前項で、「ファーストレスポンダは、最初にイベントに受け取るオブジェクト」と説明しましたが、これはどういうことでしょう。次の図を見てください。MyClipウィンドウのオブジェクト階層を示しています。

図 MyClipウィンドウ階層図

 図のようにNSTextViewは、“NSClipView”というオブジェクトに内包されています。そしてNSClipViewは、“NSScrollView”に内包されていて、その上は“NSView”となり、最後に“NSWindow”となります。

 MyClipではユーザの操作によって発生したイベントはまずテキストビューが受け取ることになります。つまりテキストビューがファーストレスポンダ(first responder)になっています。どのビューパーツがファーストレスポンダになるかはアプリケーションによって違ってきますが、テキストを入力できるビューパーツで挿入カーソルが点滅していれば、そのオブジェクトが、その時のファーストレスポンダになっています。またMyClipでは“None”に設定しましたが、“Focus Ring”が表示されているオブジェクトもファーストレスポンダである可能性が高いです。ここで「可能性が高い」と、あくまでも確定していないのは、例えばTextViewの場合にはFocus Ringを表示しているのはその周りにあるスクロールビューだからです。

 MyClipは、単純なオブジェクト階層になっていますので前節で使用したNSWindowのfirstResponderメッセージで得られるオブジェクトは常にテキストビューになります。しかし多くのアプリケーションでそうなるとは限らないことは容易に想像できることでしょう。そのことから前節では「アウトレットを宣言してテキストビューと静的に接続したほうが良い」と言いました。

紙面の都合で紹介できませんが、ファーストレスポンダを強制的にあるオブジェクトに固定することはできます。


■ レスポンダチェーン

 ファーストレスポンダがイベントを受け取っても、そのイベントに応えられない場合があります。その場合は、イベントは上の階層のオブジェクトへ送られます。そしてそのオブジェクトもイベントに応えられなければ、イベントはさらに上の階層のオブジェクトへ送られます。そしてどのオブジェクトもイベントに応えられなければ、イベントは最終的にNSApplicationオブジェクトに送られます。そしてそこでも応えられなければ、警告音が発せられるか、イベントが単に無視されることになります。このイベントが次から次へと上の階層のオブジェクトに送られる仕組みのことをレスポンダチェーン (responder chain) と呼びます。



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


Copyright 2006 - 2010 viva Cocoa. All Rights Reserved.