MacOS SwiftUI, как предотвратить действие закрытия окна

Итак, у меня есть приложение swiftUI, в какой-то момент я создаю NSWindow и назначаю contentView, например:

        // ////////////////////////////////////////////////////////
        // Add token window
        // ////////////////////////////////////////////////////////

        let configurationView = ConfigurationView().environmentObject(store)

        configurationWindow = NSWindow(
            contentRect: NSRect(x:0, y: 0, width: 480, height: 500),
            styleMask: [.titled, .closable, .miniaturizable, .fullSizeContentView],
            backing: .buffered, defer: false
        )
        configurationWindow.center()
        configurationWindow.setFrameAutosaveName("BSchauer")
        let hostingController = NSHostingController(rootView: configurationView)
        configurationWindow.contentViewController = hostingController
        configurationWindow.makeKeyAndOrderFront(nil)
        configurationWindow.setIsVisible(false)
    ... 
   // later on in the code
   @objc func toggleConfigurationWindow() {
        if self.configurationWindow.isVisible {
            self.configurationWindow.setIsVisible(false)
            if let button = self.statusBarItem.button {
                self.popover.show(relativeTo: button.bounds, of: button, preferredEdge: NSRectEdge.minY)
            }
        } else {
            self.configurationWindow.setIsVisible(true)

            self.configurationWindow.contentViewController?.view.window?.becomeKey()
        }
    }

Вы видите, что я взаимодействую с окном, чтобы представить его пользователю, с помощью флага visible, теперь проблема в том, что когда окно отображается и закрывается с помощью кнопки закрытия на верхней панели, окно каким-то образом отключается (?) и в следующий раз, когда пользователь попытается взаимодействовать с приложением и повторно открыть окно, я получаю ошибку сегментации.

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

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

TL: DR: когда пользователь нажимает красную кнопку закрытия в окне, вместо того, чтобы окно разрушалось, я просто хочу установить его видимость на false


person Oscar Franco    schedule 19.04.2020    source источник


Ответы (1)


Я заставил это работать, не нужно устанавливать contentViewController, вы можете использовать стандартный contentView:

configurationWindow.contentView = NSHostingView(rootView: configurationView)

и отключить выпуск окна при закрытии:

configurationWindow.isReleasedWhenClosed = false

Мне все равно было бы интересно узнать, когда окно закрылось, чтобы, возможно, впоследствии выполнить действие, но это все еще решает мою проблему

person Oscar Franco    schedule 19.04.2020