タイトル今から始めるCocoaプログラミング》文書ファイルを扱うアプリケーションを作る(12)開いたときにカーソルを点滅カテゴリーユーザインタフェース, Cocoa, 今から始めるCocoaプログラミング
作成日2001/12/28 16:26:33作成者新居雅行
これでいちおうのファイルの読み書きができるようになったが、ファイルを開くとNSTextViewはアクティブにはなっていないため、クリックしないとカーソルが中で点滅をしない。これには実はちょっと悩んだ。Visual Basic的に考えたら、アクティベートするというメソッドがあるのかと思い、クラス階層を一生懸命たどったのであるが、どうも見つけられない。そこで、サンプルコードをみていたら、NSWindowクラスにmakeFirstResponderという呼び出しがあるのを見つけた。これは、そのウインドウのFirst Responderとなるコンポーネントを指定するのであるが、文書をよく読むと、マウスダウンイベントを受け付けるレスポンダを置き換えると解説されている。このFirst Responderはウインドウの中の最初にイベントを受け付けるコンポーネントと言うことであるのだが、つまりは、ユーザの応答を受け付ける意味での“アクティブである”といのはFirst Responderであるということと同義と考えていいのではないかと思われる。目的としては「NSTextViewにカーソルを表示したい」ということであるが、このあたりの事情は知っていないとつかみにくいところだろう。また、ファイルを開いたときには、文書の末尾にカーソルが設定されるので、NSTextViewのメソッドを使って選択範囲を指定した。それらの機能をwindowControllerDidLoadNibに組み込むと、次のようになる。必要なメソッドの情報も合わせて紹介しておこう。

public void windowControllerDidLoadNib(NSWindowController aController) {
super.windowControllerDidLoadNib(aController);
setupWindowFromData();
docTextView.window().makeFirstResponder(docTextView);
}

☆引数に指定したコンポーネントをFirst Responderにする
 boolean 《NSWindow》.makeFirstResponder(NSResponder aResponder)
 戻り値:First Responderの設定ができればtrue、できないとfalse
 引数:aResponder:First Responderに設定するコンポーネント

☆コントロールが所属するウインドウを求める
 NSWindow 《NSView》.window()
 戻り値:コントロールが所属するウインドウへの参照

NSTextViewは、NSView、NSResponderをいずれもスーパークラスとして持っているクラスである。なお、makeFirstResponderは、引数に指定したオブジェクトにメッセージを送り、Responderになっていいかどいうかの判断や、Responderになったときに行う処理をさせることができる。言い換えれば、そうした処理を独自に書き換えるということも可能だということに他ならない。

なお、Responder関連のイベントについては以下の文書で解説されている。

◇Cocoa Programming Topic: Basic Event Handling
 http://devworld.apple.com/techpubs/macosx/Cocoa/TasksAndConcepts/ProgrammingTopics/BasicEventHandling/index.html

(この項、続く)
関連リンク