如何从视图中取消nspopover?

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

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

复制代码
self.popover = NSPopover()
self.popover.contentViewController = NSHostingController(rootView: contentView)

复制

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

Stack Overflow用户

发布于 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>) {
    }
}
相关推荐
谢娘蓝桥1 天前
Mac 安装 Xcode 及qt 环境安装
ide·macos·xcode
伟大的大威2 天前
Android 端离线语音控制设备管理系统:完整技术方案与实践
android·macos·xcode
2501_916007477 天前
从零开始学习iOS App开发:Xcode、Swift和发布到App Store完整教程
android·学习·ios·小程序·uni-app·iphone·xcode
大熊猫侯佩7 天前
Swift 6.2 列传(第一篇):主线 Actor 的 “独尊令”
xcode·actor·swift 6.2·数据竞争·mainactor·swift evolution·isolated
数据饕餮9 天前
faster-whisper热词详解与程序设计
ide·macos·xcode
说话的鲸鱼11 天前
‌Python+WhisperX:医疗语音识别的精准与高效实践
python·语音识别·xcode
旺仔大牛13 天前
Xcode垃圾清理
ide·macos·xcode
—Qeyser15 天前
Flutter网络请求Dio封装实战
网络·flutter·php·xcode·android-studio
咸鱼一号20 天前
记录我适配iOS26遇到的一些问题
xcode
QuantumLeap丶21 天前
《Flutter全栈开发实战指南:从零到高级》- 04 - Widget核心概念与生命周期
flutter·xcode