Objective c 删除“删除”;“最近开放”;Cocoa应用程序中的菜单项

Objective c 删除“删除”;“最近开放”;Cocoa应用程序中的菜单项,objective-c,cocoa,macos,nsmenu,Objective C,Cocoa,Macos,Nsmenu,我发现很多人问这个问题(删除或禁用“最近使用的项目”子菜单),但没有回答 经过一点调查。。。问题是,苹果已经秘密地硬编码了那个特定的菜单,让它总是出现——即使你删除了它,NSWindowController也会默默地重新创建它。编辑:一些白痴想改写我的答案。不要。否则我会删除它。正如最初拒绝该编辑的评论员所说:“这个编辑太小了;建议的编辑应该是实质性的改进,以解决文章中的多个问题。”所以:不要 苹果有一个官方的解决办法(他们不情愿地承认自己在硬编码菜单时的错误): 似乎工作正常,一旦设置了I

我发现很多人问这个问题(删除或禁用“最近使用的项目”子菜单),但没有回答


经过一点调查。。。问题是,苹果已经秘密地硬编码了那个特定的菜单,让它总是出现——即使你删除了它,NSWindowController也会默默地重新创建它。

编辑:一些白痴想改写我的答案。不要。否则我会删除它。正如最初拒绝该编辑的评论员所说:“这个编辑太小了;建议的编辑应该是实质性的改进,以解决文章中的多个问题。”所以:不要


苹果有一个官方的解决办法(他们不情愿地承认自己在硬编码菜单时的错误):

似乎工作正常,一旦设置了IBOutlet:

@property( nonatomic, retain) IBOutlet NSMenu* fileMenu;
…并确保在MainWindow.xib中表示AppDelegate类(例如,使用蓝色多维数据集对象,并将该类设置为AppDelegate所属的任何类)。。。因此,您可以将NIB中的文件菜单本身直接连接到您的应用程序代理

编辑:事实上,修改-苹果的源代码没有正确使用Xcode4编译,生成了一个编译器警告。您希望这样做:

NSInteger openDocumentMenuItemIndex = [self.fileMenu indexOfItemWithTarget:nil andAction:@selector(openDocument:)];

if (openDocumentMenuItemIndex>=0 &&
    [[self.fileMenu itemAtIndex:openDocumentMenuItemIndex+1] hasSubmenu])
{
    // APPLE'S COMMENT: We'll presume it's the Open Recent menu item, because this is
    // APPLE'S COMMENT: the heuristic that NSDocumentController uses to add it to the
    // APPLE'S COMMENT: File menu
    [self.fileMenu removeItemAtIndex:openDocumentMenuItemIndex+1];
}