【问题标题】: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>) {
}
}