You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NSHostingController右键菜单无法激活问题求助

为SwiftUI视图添加自定义NSMenu上下文菜单(macOS)

我正在尝试编写某实现方案的macOS版本,按理解,设置NSResponder的menu属性后,右键点击时菜单应自动显示,但尝试以下几种方法均未成功:

  • 方法A:为NSHostingController的view设置menu——右键或Ctrl点击无任何反应。
  • 方法B:直接为NSHostingController设置menu——程序崩溃,报错:Abstract method -[NSResponder setMenu:] called from class _TtGC7SwiftUI19NSHostingControllerGVS_21_ViewModifier_...__. Subclasses must override
  • 方法C:在NSHostingController或NSView的自定义子类的rightMouseDown方法中手动调用NSMenu.popup——无任何反应。

以下是我的实现代码:

extension View {
    func contextMenu(menu: NSMenu) -> some View {
        modifier(ContextMenuViewModifier(menu: menu))
    }
}

struct ContextMenuViewModifier: ViewModifier {
    let menu: NSMenu

    func body(content: Content) -> some View {
        Interaction_UI(
            view: { content },
            menu: menu
        )
            .fixedSize()
    }
}

private struct Interaction_UI<Content: View>: NSViewRepresentable {
    typealias NSViewType = NSView

    @ViewBuilder var view: Content
    let menu: NSMenu

    func makeNSView(context: Context) -> NSView {
        let v = NSHostingController(rootView: view)

        // option A - no effect
        v.view.menu = menu

        // option B - crash
        v.menu = menu

        return v.view
    }

    func updateNSView(_ nsView: NSViewType, context: Context) {
        // part of option A
        nsView.menu = menu
    }
}

内容的提问来源于stack exchange,提问作者Cameron Little

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 23:15:58