我正在使用Swift和SwiftUI编写一个MacOS。我对此真的很陌生,但我是一个经验丰富的程序员。
该应用程序是一个带有一个NSPopover的菜单栏应用程序。在AppDelegate中,我包括:
- self.popover = NSPopover()
- self.popover.contentViewController = NSHostingController(rootView: contentView)
复制
在contentView中,是否可以包含一个关闭弹出窗口的按钮?
发布于 2020-09-16 16:59:01
您可以在响应器链中找到NSPopover,然后将其关闭。要实现这一点,您应该为close按钮创建一个协调器:
- struct CloseButton: NSViewRepresentable {
-
- class Coordinator: NSObject {
- @objc func click(_ button: NSButton) {
- var responder: NSResponder? = button
- while responder != nil {
- responder = responder?.nextResponder
- if let popover = responder as? NSPopover {
- popover.close()
- break
- }
- }
- }
- }
-
- func makeNSView(context: NSViewRepresentableContext<Self>) -> NSButton {
- NSButton(title: "Close", target: context.coordinator, action: #selector(Coordinator.click(_:)))
- }
-
- func makeCoordinator() -> CloseButton.Coordinator {
- return Coordinator()
- }
-
- func updateNSView(_ nsView: NSButton, context: NSViewRepresentableContext<Self>) {
- }
- }