2

Итак, вот мой случай:Как правильно обрабатывать завершение приложения какао?

Я разрабатываю нестандартное приложение на основе документов, и я хочу обработать сценарий прерывания завершения, когда в любом из документов по-прежнему сохраняются несохраненные изменения.

Моя первоначальная идея заключается в том:

  • Пользователь пытается выйти из приложения (либо через пункт меню "Quit XXXXX" или нажав на кнопку "X")
  • Существуют ли какие-либо измененные документы?
  • если НЕТ: прекратить
  • если ДА: уведомить пользователя о том, что существуют немодифицированные документы. если он хочет продолжить, то брось. Остальное прекращение отмены.

Итак, я решил сделать это делегатским путем.

В моей заявке делегат, я реализовал:

  • -windowToClose: (срабатывает на NSWindowWillCloseNotification)
  • applicationShouldTerminate:
  • applicationShouldTerminateAfterLastWindowClosed:

Теперь, это то, что я имею в виду , В методе applicationShouldTerminate::

  • Возврат NSTerminateNow если нет измененных документов не существует
  • Возврат NSTerminateCancel если Есть модифицированные документы. В этом случае, выскочит уведомление лист или что-то подобное, и если пользователь подтверждает, что он хочет уйти, то называть [NSApp terminate:nil];

Это правильный путь идти о нем?

Любые предложения?

ответ

7

Это действительно, как это сделать. Но в вашей реализации applicationShouldTerminate вы должны просто открыть предупреждение прямо там и вернуть NSTerminateNow, если пользователь не нажал Cancel; NSTerminateCancel в противном случае. Нет необходимости вручную завершать работу приложения позже.

Редактировать: показать оповещение в виде листа, но запустить его как модальное диалоговое окно, вызвать beginSheetModalForWindow при оповещении, затем позвонить [NSApp runModalForWindow:alert]. Кроме того, в конце селектора, который вы передаете для beginSheetModalForWindow, вам нужно позвонить [NSApp stopModal], чтобы выйти из модального цикла.

Однако в этом случае лучше запустить оповещение в виде листа для окна и вернуть NSTerminateLater в свою реализацию applicationShouldTerminate. Затем, в конце селектора для предупреждения, вызовите [NSApp replyToApplicationShouldTerminate:]. Именно так Apple рекомендует реализовать это.

+0

Хорошая идея; однако, вот код, который я использую для предупреждающего листа YES-NO (http://snippet.mx/Ra8E). Как я могу сделать это так, чтобы он возвращался в пределах одной и той же функции? –

Смежные вопросы