Закрытие дочерних окон в Какао, когда главное окно закрыто - PullRequest
2 голосов
/ 05 октября 2009

Я новичок в Какао, так что, скорее всего, мой подход неверен, но ..

У меня есть приложение, которое открывает несколько дочерних окон (после загрузки главного / родительского окна), используя NSWindowController и initNibWIthName:. Это отлично работает.

Но когда я закрываю родительское окно (используя красный х), они остаются открытыми и не позволяют приложению закрываться, пока они не будут закрыты. Это имеет смысл, поскольку я никуда их не закрываю.

Но как мне это сделать? В этот момент должно быть событие, которое вызывается, но я не могу найти, где оно находится.

Уведомления, такие как applicationWillTerminate (и т. Д.), Вызываются только тогда, когда приложение фактически завершается, а не когда нажата кнопка закрытия.

Наверное, я ищу что-то похожее на сообщения типа Windows WM_CLOSE.

Ответы [ 3 ]

4 голосов
/ 06 октября 2009

Ближайший эквивалент, который вы найдете - это NSWindowWillCloseNotification, опубликованный окном до его закрытия. Вероятно, вы можете заставить дочерние окна закрываться, когда родительское окно закрывается, используя:

NSWindow *parentWindow;
NSArray *childWindows;

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

Если дочернее окно будет освобождено до его родителя, обязательно отмените его регистрацию для уведомлений до того, как это произойдет.

Метод делегата, упомянутый Марком, является удобным методом для делегата, который избавляет его от необходимости регистрироваться для уведомления, которое они, вероятно, в любом случае захотят. Вам не нужно создавать оконный контроллер только для получения этого сообщения; просто отправка окна [window setDelegate:myObject] заставит myObject получить сообщение -windowWillClose:, если оно ответит на метод.

Кстати, то, что Cocoa называет «дочерними окнами», отличается от того, о чем вы думаете. Они не рассматриваются в Руководстве по программированию окон , но если вы посмотрите документацию по связанным методам в NSWindow, вы увидите, что они в основном отслеживают движения своего родительского окна, так что они двигаются вместе с ним.

Если вы приехали в Какао из-за программирования на Win32, вы можете найти, что Apple Портирует на Mac OS X из Windows Win32 API , чтобы подчеркнуть концептуальные различия между Win32 и Какао.

3 голосов
/ 05 октября 2009
2 голосов
/ 06 октября 2009

Windows и приложения - это не одно и то же в Mac OS X.

Если у вас интерфейс с одним окном, с главным окном и без других, кроме About, Preferences и т. Д., То вы должны реализовать applicationShouldTerminateAfterLastWindowClosed: в делегате приложения и вернуть YES. Это единственный способ (кроме того, что вы делаете это вручную), когда закрытие окна приводит к закрытию приложения.

Если у вас есть многооконный интерфейс (как в типичном приложении на основе документов), то вы должны сделать все эти окна одноранговыми. Окна, такие как инспекторы и палитры инструментов, должны быть плавающими панелями, а не обычными окнами. И закрытие последнего окна никогда не должно закрывать такое приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...