【问题标题】:How can I dismiss a nspopover from within a view?如何从视图中关闭 nspopover?
【发布时间】:2020-09-16 04:59:03
【问题描述】:

我正在使用 Swift 和 SwiftUI 编写 MacOS。我对此真的很陌生,但我是一个经验丰富的程序员。

该应用是带有一个 NSPopover 的菜单栏应用。在 AppDelegate 中,我包括:

self.popover = NSPopover()
self.popover.contentViewController = NSHostingController(rootView: contentView)

contentView 中,是否可以包含一个关闭弹出框的按钮?

【问题讨论】:

    标签: swift macos swiftui nspopover


    【解决方案1】:

    您可以在响应者链中找到您的 NSPopover,然后将其关闭。要实现这一点,您应该为关闭按钮创建一个协调器:

    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>) {
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 2018-09-10
      • 1970-01-01
      相关资源
      最近更新 更多