第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以外の代理オブジェクトの働きは次のようになります。
前項で、「ファーストレスポンダは、最初にイベントに受け取るオブジェクト」と説明しましたが、これはどういうことでしょう。次の図を見てください。MyClipウィンドウのオブジェクト階層を示しています。
図 MyClipウィンドウ階層図
図のようにNSTextViewは、“NSClipView”というオブジェクトに内包されています。そしてNSClipViewは、“NSScrollView”に内包されていて、その上は“NSView”となり、最後に“NSWindow”となります。
MyClipではユーザの操作によって発生したイベントはまずテキストビューが受け取ることになります。つまりテキストビューがファーストレスポンダ(first responder)になっています。どのビューパーツがファーストレスポンダになるかはアプリケーションによって違ってきますが、テキストを入力できるビューパーツで挿入カーソルが点滅していれば、そのオブジェクトが、その時のファーストレスポンダになっています。またMyClipでは“None”に設定しましたが、“Focus Ring”が表示されているオブジェクトもファーストレスポンダである可能性が高いです。ここで「可能性が高い」と、あくまでも確定していないのは、例えばTextViewの場合にはFocus Ringを表示しているのはその周りにあるスクロールビューだからです。
MyClipは、単純なオブジェクト階層になっていますので前節で使用したNSWindowのfirstResponderメッセージで得られるオブジェクトは常にテキストビューになります。しかし多くのアプリケーションでそうなるとは限らないことは容易に想像できることでしょう。そのことから前節では「アウトレットを宣言してテキストビューと静的に接続したほうが良い」と言いました。
紙面の都合で紹介できませんが、ファーストレスポンダを強制的にあるオブジェクトに固定することはできます。
ファーストレスポンダがイベントを受け取っても、そのイベントに応えられない場合があります。その場合は、イベントは上の階層のオブジェクトへ送られます。そしてそのオブジェクトもイベントに応えられなければ、イベントはさらに上の階層のオブジェクトへ送られます。そしてどのオブジェクトもイベントに応えられなければ、イベントは最終的にNSApplicationオブジェクトに送られます。そしてそこでも応えられなければ、警告音が発せられるか、イベントが単に無視されることになります。このイベントが次から次へと上の階層のオブジェクトに送られる仕組みのことをレスポンダチェーン (responder chain) と呼びます。
目次 | < 前ページ 次ページ > |