applicationShouldTerminateAfterLastWindowClosed: похоже, не работает, когда красный крестик используется для закрытия моего приложения Какао - PullRequest
1 голос
/ 12 ноября 2009

У меня есть небольшое приложение OSX Cocoa, которое просто вызывает IKPicutreTaker и сохраняет изображение в файл, если оно установлено. Я использую applicationShouldTerminateAfterLastWindowClosed: чтобы закрыть приложение, когда pictureTaker закрыт. Это все работает нормально, когда я либо установил (это делается, когда вы выбрали нужную картинку) или когда вы нажмете кнопку отмены, но когда я нажимаю на красную стрелку в левом верхнем углу окна, приложение не закрывается, когда окно закрыто таким образом. Это предполагаемая функциональность или я делаю что-то не так (не устанавливая какой-либо флаг?). Кроме того, есть ли способ отключить эту кнопку?

1 Ответ

2 голосов
/ 12 ноября 2009

Нажатие на красную кнопку не закрывает приложение, отчасти потому, что этот глагол не совпадает с этим существительным. Красная кнопка закрывает окно, в котором она включена; оно не выходит из вашего приложения. (Приложение может иметь и будет иметь несколько окон в Mac OS X.)

Вот где приходит applicationShouldTerminateAfterLastWindowClosed:. Всякий раз, когда пользователь закрывает последнее окно на экране (нажатием красной кнопки, выбором «Закрыть» в меню «Файл» или другими способами), объект NSApplication будет applicationShouldTerminateAfterLastWindowClosed: сообщение его делегату, чтобы спросить его, должно ли приложение завершиться. Если делегат отвечает на сообщение, возвращая YES, приложение завершает свою работу.

Вы не говорите точно, как вы «используете» applicationShouldTerminateAfterLastWindowClosed:. Если вы просто отправляете его какому-либо объекту, это не сработает, потому что вы задаете вопрос («должно ли приложение завершиться после закрытия последнего окна?»), А затем игнорируете ответ. Если вы реализуете метод в объекте, но этот объект не является делегатом приложения, это тоже не сработает - объект приложения только отправляет это сообщение своему делегату.

Вам необходимо реализовать метод в своем делегате и возвращать YES, когда уместно завершить приложение, когда пользователь закрывает свое последнее окно.

...