如何在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在菜单更新时删除对应项:
- 在
applicationDidFinishLaunching中给编辑菜单设置代理 - 实现
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
相关产品推荐
相关产品推荐

