2

私はココア初心者なので、私のアプローチは間違っている可能性がありますが..

とを使用して(メイン/親ウィンドウがロードされた後)いくつかの子ウィンドウを開くアプリがありNSWindowControllerますinitNibWIthName:。これは正常に機能します。

しかし、(赤いxを使用して)親ウィンドウを閉じると、これらは開いたままになり、閉じるまでアプリが閉じるのを防ぎます。私はどこにもそれらを閉じていないので、これは理にかなっています。

しかし、どうすればこれを行うことができますか?この時点で呼び出されるイベントがあるはずですが、どこにもそれが何であるかがわかりません。

(など)などの通知applicationWillTerminateは、閉じるボタンが押されたときではなく、アプリケーションが実際に終了しているときにのみ呼び出されます。

WM_CLOSEWindowsタイプのメッセージに似たものを探していると思います。

4

3 に答える 3

4

最も近いものはNSWindowWillCloseNotification、ウィンドウが閉じる前にウィンドウによって投稿されたものです。親ウィンドウが閉じたときに子ウィンドウを閉じるには、おそらく次を使用できます。

NSWindow *parentWindow;
NSArray *childWindows;

NSNotificationCenter *noteCenter = [NSNotificationCenter defaultCenter];
for (NSWindow *childWindow in childWindows) {
  [noteCenter
   addObserver:childWindow selector:@selector(close)
   name:NSWindowWillCloseNotification object:parentWindow];
}

子ウィンドウが親の前に割り当て解除される場合は、その前に必ず通知用に登録解除してください。

Mark が言及したデリゲート メソッドはデリゲートにとって便利なメソッドであり、デリゲートが必要とする可能性が高い通知に登録する手間を省きます。そのメッセージを受信するためだけにウィンドウ コントローラーを作成する必要はありません。ウィンドウ[window setDelegate:myObject]を送信するだけで、メソッドに応答した場合にメッセージmyObjectが受信されます。-windowWillClose:

ところで、Cocoa が「子ウィンドウ」と呼ぶものは、皆さんが考えているものとは異なります。これらはWindow Programming Guideでは扱われていませんが、 の関連するメソッドのドキュメントをNSWindow見ると、基本的に親ウィンドウの動きを追跡し、親ウィンドウと一緒に移動することがわかります。

Win32 プログラミングから Cocoa に移行する場合は、Apple のWindows Win32 API から Mac OS X への移植が Win32 と Cocoa の概念上の違いを強調するのに役立つことに気付くかもしれません。

于 2009-10-06T05:54:45.777 に答える
3

windowWillClose:

Apple 開発者向けドキュメント NSWindowDelegate

于 2009-10-05T11:58:28.190 に答える
2

Windows とアプリケーションは、Mac OS X では同じではありません。

メイン ウィンドウがあり、About、Preferences など以外に何もない単一ウィンドウ インターフェイスがある場合はapplicationShouldTerminateAfterLastWindowClosed:、アプリケーションにデリゲートと returnを実装する必要がありますYES。これは、ウィンドウを閉じるとアプリケーションが終了する唯一の方法です (手動で行う場合を除く)。

(典型的なドキュメント ベースのアプリケーションのように) 複数ウィンドウのインターフェイスを使用している場合は、それらのすべてのウィンドウを相互にピアリングする必要があります。インスペクタやツール パレットなどのウィンドウは、通常のウィンドウではなく、フローティング パネルにする必要があります。また、最後のウィンドウを閉じても、そのようなアプリは決して終了してはなりません。

于 2009-10-05T22:05:44.440 に答える