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

如何在Xamarin.Mac/Xamarin.Forms中移除编辑菜单的Emoji与符号选项

macOS应用编辑菜单自动注入项移除方案

这两个菜单项是macOS系统默认给所有支持编辑操作的应用自动注入的,不会出现在Storyboard的菜单配置中,可以通过以下两种代码方案移除:

方案1:拦截系统动作(推荐,不受多语言影响)

两个自动注入的菜单项分别对应startDictation:(开始听写)和orderFrontCharacterPalette:(Emoji & Symbols)两个系统动作,只要在AppDelegate中声明不响应这两个动作,系统就不会自动生成对应菜单项:

  • Objective-C 实现:
- (BOOL)respondsToSelector:(SEL)aSelector {
    if (aSelector == @selector(startDictation:) || aSelector == @selector(orderFrontCharacterPalette:)) {
        return NO;
    }
    return [super respondsToSelector:aSelector];
}
  • Swift 实现:
override func responds(to aSelector: Selector!) -> Bool {
    if aSelector == #selector(NSResponder.startDictation(_:)) || 
       aSelector == #selector(NSResponder.orderFrontCharacterPalette(_:)) {
        return false
    }
    return super.responds(to: aSelector)
}

方案2:手动移除菜单项

如果需要保留对这两个动作的响应,仅隐藏菜单选项,可以通过NSMenuDelegate在菜单更新时删除对应项:

  1. 在applicationDidFinishLaunching中给编辑菜单设置代理
  2. 实现menuNeedsUpdate方法遍历删除匹配项

Swift示例代码:

func applicationDidFinishLaunching(_ aNotification: Notification) {
    // 取主菜单的第二个菜单项,默认即为编辑菜单
    guard let editMenu = NSApp.mainMenu?.item(at: 1)?.submenu else { return }
    editMenu.delegate = self
}

extension AppDelegate: NSMenuDelegate {
    func menuNeedsUpdate(_ menu: NSMenu) {
        menu.items.removeAll { item in
            item.title == "开始听写" || item.title == "Emoji & Symbols"
        }
    }
}

注意:多语言应用使用该方案时需要匹配对应语言的菜单项标题,否则会出现删除失效的问题。

内容的提问来源于stack exchange,提问作者Samuel James

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:06:10