如何在非NSDocument应用中显示「Revert to Saved」菜单项
让非NSDocument应用显示「Revert to Saved」菜单项的方法
Cocoa会自动根据应用是否基于NSDocument架构,隐藏这类和文档操作绑定的系统默认菜单项——哪怕你手动绑定了action、在validateMenuItem:里返回YES,系统的菜单管理逻辑还是会把它隐藏掉。下面是两种可行的解决办法:
方法一:手动创建自定义菜单项(推荐)
这是最稳定的方案,完全避开系统的自动隐藏逻辑:
- 打开项目的Main Menu故事板,找到「File」菜单
- 删除原本默认的「Revert to Saved」菜单项,或者直接修改它的配置:
- 给菜单项设置一个自定义的Identifier(不要用系统默认的那个,系统默认ID和NSDocument强绑定)
- 将菜单项的Action绑定到你实现的
-revertDocumentToSaved:方法
- 后续通过
validateMenuItem:控制菜单项的启用状态即可,示例代码:- (BOOL)validateMenuItem:(NSMenuItem *)menuItem { if ([menuItem.action isEqual:@selector(revertDocumentToSaved:)]) { // 根据你的业务逻辑判断是否启用,比如检查是否有可恢复的内容 return YES; } return [super validateMenuItem:menuItem]; }
方法二:强制显示系统默认菜单项
如果一定要保留系统默认的菜单项,可以在应用启动后手动修改它的隐藏状态:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { // 遍历主菜单找到File菜单(注意:菜单索引可能因系统版本变化,需自行验证) NSMenu *fileMenu = [[NSApp mainMenu] itemWithTitle:@"File"].submenu; for (NSMenuItem *item in fileMenu.itemArray) { if ([item.title isEqualToString:@"Revert to Saved"]) { item.hidden = NO; break; } } }
⚠️ 注意:这种方法依赖系统菜单的结构,后续系统版本更新可能导致失效,不推荐长期使用。
本质原因是系统默认的「Revert to Saved」菜单项和NSDocumentController深度绑定,非NSDocument应用中系统会自动移除这类菜单项,所以手动自定义是更稳妥的选择。
内容的提问来源于stack exchange,提问作者fbitterlich
相关产品推荐
相关产品推荐

