Как сделать так, чтобы конкретное окно имело право выходить из приложения после закрытия его последнего окна, но не для всего приложения? - PullRequest
0 голосов
/ 07 октября 2018

В моем приложении несколько оконных контроллеров, но я хочу, чтобы только некоторые оконные контроллеры выходили из приложения после закрытия последнего окна.Я попытался добавить applicationShouldTerminateAfterLastWindowClosed(_:) в AppDelegate.swift файл:

func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
    return true
}

Но похоже, что это работает для всего приложения, чтобы выйти из приложения после закрытия последнего окна.

Причина, почемуЯ хочу добиться этого, чтобы некоторые из моих переходов в моем приложении включали закрытие окна и отображение нового окна, используя self.view.window!.close() или NSApp.mainWindow!.close(), после вызова этих функций приложение немедленно закрывается.Поэтому я не хочу, чтобы applicationShouldTerminateAfterLastWindowClosed(_:) применялся ко всему приложению.

Я пытался использовать exampleWindowController.showWindow(self) перед вызовом функций, чтобы закрыть предыдущее окно, но, тем не менее, это не сработало, оновсе еще прервал мое приложение.Я также попытался использовать windowShouldClose(_:) из NSWindowDelegate, чтобы сообщить приложению о завершении работы после закрытия окна для определенного оконного контроллера (возможно, у меня возникло недопонимание относительно правильного использования этой функции):

extension exampleWindowController: NSWindowDelegate {
    func windowWillClose(_ notification: Notification) {
        NSApp.terminate(self)
    }
}

Но все же, ничего не произошло ...

Поэтому я спрашиваю, есть ли способ достичь этого?

Если нет, то я спрашиваю, есть ли способ сказать, что приложение невыйти в определенное время, когда я программно закрываю окно?

PS Я использую Xcode 10 с Swift 4.2 Cocoa API

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Я нашел способ добиться этого путем реализации applicationShouldTerminateAfterLastWindowClosed в AppDelegate с return true, а затем путем реализации windowShouldClose(_sender:) во всех классах контроллера представления, которые я хочу определить, должно ли окно закрываться (Приложениедолжен выйти, так как applicationShouldTerminateAfterLastWindowClosed всегда возвращает true), когда окно получает сообщение performClose(_:).И теперь все работает отлично.

0 голосов
/ 07 октября 2018

Документы для applicationShouldTerminateAfterLastWindowClosed говорят, что он вызывается во время принятия решения (каждый раз):

Приложение отправляет это сообщение вашему делегату, когдапоследнее окно приложения закрыто.

Это позволяет вам дать другой ответ при разных обстоятельствах.

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

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

...