很好的问题.. 前段时间我也为这个问题苦苦挣扎过。
您可以使您的AppDelegate 或类符合NSWindowDelegate 协议。
然后将self作为窗口的委托传递
myWindow.delegate = self
并实现以下功能以通过关闭动作通知
func windowShouldClose(_ sender: NSWindow) -> Bool
{}
编辑:
在使用 SwiftUI 生命周期时,可以添加AppDelegate。你也可以实现你自己的WindowManager 类。这是一个例子:
class WindowManager : NSObject, NSWindowDelegate {
var popUpWindow : NSWindow? = nil
override init() {}
func openMyWindow()
{
popUpWindow = (NSWindow(
contentRect: NSRect(x: 100, y: 100, width: 100, height: 600),
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
backing: .buffered, defer: false))
popUpWindow!.contentView = NSHostingView(rootView: PopUpView())
popUpWindow!.makeKeyAndOrderFront(nil)
popUpWindow?.delegate = self
}
func windowShouldClose(_ sender: NSWindow) -> Bool
{
print("Window will close")
return true
}
}
struct PopUpView : View {
var body: some View {
Text("This is a new popup view")
}
}
在您的 struct _: App 中创建并保存该类,然后通过此管理器打开 Windows。
@main
struct macSwiftUICycleApp: App {
let persistenceController = PersistenceController.shared
let windowManager : WindowManager = WindowManager() //<< Here keep the instance of your WindowManager
var body: some Scene {
WindowGroup {
ContentView()
.environment(\.managedObjectContext, persistenceController.container.viewContext)
.onAppear {
windowManager.openMyWindow() //<< Just a test to open another window on startup
}
}
}
}