Итак, у меня есть приложение 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