activIgnoringOtherApps и makeKeyAndOrderFront не работают после закрытия NSWindow
Я начал с проекта раскадровки. и я положил пункт Менубар. При щелчке по элементу меню в AppDelegate.swift запускается следующий метод.
func setWindowVisible() {
NSApp.activateIgnoringOtherApps(ture)
NSApp.mainWindow?.makeKeyAndOrderFront(self)
}
это приводит мое приложение впереди. Но как только я нажимаю кнопку закрытия, красную в окне, она никогда не работает.
Раньше он работал в проектах, не основанных на раскадровке, независимо от того, закрывал ли я окно.
Я поставил
NSApp.mainWindow?.releasedWhenClosed = false
в приложении DidFinishLaunching()
Кто-нибудь может мне помочь?
1 ответ
Настройка releasedWhenClosed
в applicationDidFinishLaunching
не имеет никакого эффекта, так как mainWindow
собственность на данный момент равна нулю. → Окно создается после выполнения этого метода.
releasedWhenClosed
в любом случае значение по умолчанию равно false, когда окно создается в Интерфейсном Разработчике.
Свойство mainWindow, вероятно, будет нулевым после закрытия окна, потому что тогда больше нет mainWindow. Из документов:
Значение в этом свойстве равно nil, когда раскадровка приложения или файл пера еще не завершена загрузка. Также это может быть ноль, когда приложение неактивно или скрыто.
Я смог снова показать окно (после закрытия), открыв окно изнутри windows
массив NSApp
,
NSApp.activateIgnoringOtherApps(true)
NSApp.windows[0].makeKeyAndOrderFront(self)
Если у вас более одного окна, вам нужно найти правильное в массиве.
Хотите вытянуть ответ Кайла КИМа в свой собственный ответ, поскольку приведенное выше решение с доступом к массиву вызвало для меня исключение.
В моем случае я использую эту библиотеку сочетаний клавиш, чтобы вывести приложение на передний план.
Я также использую это вместе с новой функцией приложения SwiftUI, и, к счастью, все это работает вместе - это вызовется снова, даже если вы нажмете кнопку закрытия.
class AppDelegate: NSObject, NSApplicationDelegate {
var window: NSWindow?
func applicationDidBecomeActive(_ notification: Notification) {
self.window = NSApp.mainWindow
}
func applicationDidFinishLaunching(_ aNotification: Notification) {
KeyboardShortcuts.onKeyUp(for: .toggleApp) {
if !NSApp.isActive || !(self.window?.isKeyWindow ?? false) {
NSApp.activate(ignoringOtherApps: true)
self.window?.makeKeyAndOrderFront(self)
} else {
print("App already active")
}
}
}
}
!NSApp.isActive и проверка окна ключа необходимы, потому что, когда пользователь нажимает кнопку "закрыть", окно больше не является ключом, но остается активным. Приложение остается активным, пока они не выберут другое приложение. Вы можете увидеть, как это происходит с цветами фокуса окон.
Обратите внимание, что этот AppDelegate не является основной точкой входа в мое приложение, он используется вместе с swiftUI:
@main
struct MainApp: App {
@NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {...}
}