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

如何在非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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:40:05