第5章 アプリケーションの初期化 | ||
ホーム | メール | |
目次 | < 前ページ 次ページ > |
さて、この章では本格的なコーディングに入る前の予備知識と準備のためにページを費やしましたが、NSApplicationのデリゲートメソッドを受け取る専用のオブジェクトの用意が整いましたので、ここで簡単なデリゲートの利用法を示して、Macアプリケーションのひとつの欠点とも言える問題を解決しておきましょう。また最後にはMyClipを構築する各オブジェクトの継承階層図も掲載しておきます。Cocoaプログラミングでは継承をできるだけ使わないので基本姿勢である、と言いましたが、それでも継承関係が皆無ということはありません。何かの折に、この継承階層図を見て頂ければ、理解の助けになるのではないかと思います。
Macのアプリケーションではメインのドキュメントウィンドウを閉じてもアプリケーションは終了しないことがデフォルトの状態であることはすでに述べました。このことは複数のドキュメントウィンドウを持つアプリケーションの場合は、最後のドキュメントウィンドウを閉じた時にアプリケーションが終了するかどうかは、どちらが良いとは決めかねることだと思います。しかしMyClipのようにひとつのドキュメントウィンドウ(メインウィンドウ)しか持たないアプリケーションの場合には、ウィンドウを閉じてもアプリケーションが起動したままになっていることは、おそらくジャマになるだけのことでしょう。
この最後のドキュメントウィンドウを閉じた時にアプリケーションも終了するという設定に変えることはNSApplicationのデリゲートメソッドを使うことによって簡単に実現できます。そしてMac OS X 10.6 からは、そのNSApplicationのデリゲートメソッドを実装するための専用のオブジェクトがプロジェクトにデフォルトで用意されることになったので、これを利用しない手はないでしょう。
では、次の作業手順にしたがってMyClipウィンドウを閉じるとMyClipアプリケーションも終了するように変更しましょう。
ドキュメントウィンドウをひとつしか持てないアプリケーションの場合でも、そのひとつだけのウィンドウが「最後のウィンドウ」ということになります。
- (BOOL)applicationShouldTerminateAfterLastWindowClosed: (NSApplication *)theApplication { return YES; }
さきほどのapplicationDidFinishLaunching:デリゲートメソッドの戻り値は“void”型、つまり戻り値なしでしたが、今度のapplicationShouldTerminateAfterLastWindowClosed:デリゲートメソッドの戻り値は“BOOL”型になります。つまり“YES”か“NO”の返事が欲しいわけです。そして次の式でYESを返すとアプリケーションは終了します。
return YES;
ちなみにここでNOを返すとウィンドウは閉じられますが、アプリケーションは終了しません。
話しが前後しますが、このデリゲートメソッドはシグネチャからも分かるとおり最後のウィンドウを閉じた時に送信されて「アプリケーションを終了しましょうか」と尋ねるメソッドです。アプリケーションの終了はすべてのメソッドで“terminate”という表現で統一されています。また「○○しましょうか」と、YESかNOの返事を必要とするデリゲートメソッドは“should”が使われることに統一されています。
また、このようなBOOL値を返すデリゲートメソッドは、return式の前に行っておくべき処理を記述したり、条件次第でYESを返すかNOを返すかを選択するコードを記述したりすることが一般的に行われます。
目次 | < 前ページ 次ページ > |