Objective c 无Nib的NSRecentDocumentsMenu的沙箱友好安装

Objective c 无Nib的NSRecentDocumentsMenu的沙箱友好安装,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我正在从事一个(目前)根本不使用任何nib文件的项目 我试图找出是否有任何方法可以添加不需要使用专用API的nsrecentdocuments功能表Open Recent菜单 到目前为止,我只找到了以下链接: 有人能提供见解吗 我试图找出是否有任何方法可以添加不需要使用专用API的nsrecentdocuments功能表Open Recent菜单 以下链接适用于swift中不使用nibs的基于文档的应用程序: 它使用此参考中的菜单代码修改: 该演示可以通过使用swift和XIB接口创建ma

我正在从事一个(目前)根本不使用任何nib文件的项目

我试图找出是否有任何方法可以添加不需要使用专用API的nsrecentdocuments功能表Open Recent菜单

到目前为止,我只找到了以下链接:

有人能提供见解吗

我试图找出是否有任何方法可以添加不需要使用专用API的nsrecentdocuments功能表Open Recent菜单

以下链接适用于swift中不使用nibs的基于文档的应用程序:

它使用此参考中的菜单代码修改:

该演示可以通过使用swift和XIB接口创建macOS应用程序在Xcode中运行,但我们不会使用XIB。创建一个名为main.swift的新文件,并删除现有的AppDelegate类。将上面找到的源代码复制/粘贴到main.swift文件中(使用import Cocoa而不是Foundation)。当您点击Run按钮时,您会注意到菜单变灰,并且没有打开的最近菜单项。要解决此问题,请确保将文档类和角色添加到info.plist(请参见上面文件夹中的图像)。Cocoa NSDocument类应为swift的YourApp.Document名称,或为objc的纯文档名称。在添加这些内容后点击Run(运行)按钮时,您应该拥有一个基于文档的应用程序,该应用程序具有一个功能正常的Open Recent(最近打开)菜单项。如果有问题,请发布后续信息

Objc源代码如下:

除了使用objective-c创建macOS应用程序外,说明与swift类似。删除Xcode提供的内容后,将源代码复制/粘贴到main.m中。为了简单起见,还可以删除AppDelegate和Document类(如果您在设置中选中了“基于文档”),尽管您可以根据需要使用它们。info.plist还必须使用上述两项增补内容进行修改

#import <Cocoa/Cocoa.h>

@interface Document : NSDocument {
 NSWindow *window;
 NSTextView *txtView;
}

- (void) buildWindow;
@end

@implementation Document

 - (id) init {
 if (self = [super init]) {
   [self buildWindow];
 }
 return self;
 }

 + (BOOL)autosavesInPlace {
  return YES;
  }

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError {
  return [[txtView string] dataUsingEncoding:NSUTF8StringEncoding];
  }

  - (BOOL) readFromURL:(NSURL *) absoluteURL ofType:(NSString *)typeName error:(NSError **)outError {
  NSString *str = [[NSString alloc] initWithContentsOfURL:absoluteURL encoding:NSUTF8StringEncoding error:outError];
  [txtView setString:str];
  return YES;
  }

- (void) buildWindow {

 #define _wndW  780
 #define _wndH  700

window = [[NSWindow alloc] initWithContentRect: NSMakeRect( 0, 0, _wndW, _wndH )
 styleMask: NSWindowStyleMaskTitled | NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable
 backing: NSBackingStoreBuffered defer: NO];
[window center];
[window setTitle: @"Test window"];
[window cascadeTopLeftFromPoint:NSMakePoint(600,0)];
[window makeKeyAndOrderFront: nil];

// **** Window Controller is Necessary **** //
NSWindowController *windowController = [[NSWindowController alloc]initWithWindow:window];
[self addWindowController: windowController];

// ****** NSTextView with Scroll ****** //
NSScrollView *scrlView = [[NSScrollView alloc] initWithFrame:NSMakeRect( 20, 50, _wndW - 40, _wndH - 70 )];
[[window contentView] addSubview:scrlView];
[scrlView setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable ];
[scrlView setHasVerticalScroller: YES];
txtView = [[NSTextView alloc] initWithFrame:NSMakeRect( 0, 0, _wndW - 40, _wndH - 70 )];
[txtView setUsesFindBar:YES];
[txtView setEditable:YES];
[txtView setAllowsUndo: YES];
txtView.automaticQuoteSubstitutionEnabled = NO;
[scrlView setDocumentView: txtView];

// ***** Quit btn ***** //
NSButton *quitBtn = [[NSButton alloc]initWithFrame:NSMakeRect( _wndW - 50, 5, 40, 40 )];
[quitBtn setBezelStyle:NSBezelStyleCircular ];
[quitBtn setTitle: @"Q" ];
[quitBtn setAutoresizingMask: NSViewMinXMargin];
[quitBtn setAction:@selector(terminate:)];
[[window contentView] addSubview: quitBtn];
}

@end


@interface AppDelegate : NSObject <NSApplicationDelegate>

- (void) buildMenu;

@end

@implementation AppDelegate

  - (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender {
  return NO;
  }

  - (void) buildMenu {
  NSMenu *mainMenu = [NSMenu new];
  [NSApp setMainMenu:mainMenu];

 // **** App Menu **** //
  NSMenuItem *appMenuItem = [NSMenuItem new];
  [mainMenu addItem:appMenuItem];
  NSMenu *appMenu = [NSMenu new] ;
  [appMenuItem setSubmenu:appMenu];
  NSString *appName = [[NSProcessInfo processInfo] processName];
  NSString *aboutTitle = [@"About " stringByAppendingString:appName];
  [appMenu addItemWithTitle: aboutTitle action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""];
  [appMenu addItem:[NSMenuItem separatorItem]];
  [appMenu addItemWithTitle: @"Quit" action:@selector(terminate:) keyEquivalent:@"q"];

  // ******** File Menu ********//
  NSMenuItem *fileMenuItem = [NSMenuItem new];
  [mainMenu addItem:fileMenuItem];
  NSMenu *fileMenu = [[NSMenu alloc] initWithTitle:@"File"];
  [fileMenuItem setSubmenu:fileMenu];
  [fileMenu addItemWithTitle: @"New" action: @selector(newDocument:) keyEquivalent:@"n"];
  [fileMenu addItemWithTitle: @"Open..." action: @selector(openDocument:) keyEquivalent:@"o"];
  [fileMenu addItem: [NSMenuItem separatorItem]];
  [fileMenu addItemWithTitle: @"Close" action: @selector(performClose:) keyEquivalent:@"w"];
  [fileMenu addItemWithTitle: @"Save" action: @selector(saveDocument:) keyEquivalent:@"s"];
  [fileMenu addItemWithTitle: @"SaveAs..." action: @selector(saveDocumentAs:) keyEquivalent:@""];

  // ******** Edit Menu ********//
  NSMenuItem *editMenuItem = [NSMenuItem new];
  [mainMenu addItem:editMenuItem];
  NSMenu *editMenu = [[NSMenu alloc] initWithTitle:@"Edit"] ;
  [editMenuItem setSubmenu:editMenu];
  [editMenu addItemWithTitle: @"Undo" action:@selector(undo:) keyEquivalent:@"z"];
  [editMenu addItemWithTitle: @"Redo" action:@selector(redo:) keyEquivalent:@"Z"];
  [editMenu addItem:[NSMenuItem separatorItem]];
  [editMenu addItemWithTitle: @"Cut" action:@selector(cut:) keyEquivalent:@"x"];
  [editMenu addItemWithTitle: @"Copy" action:@selector(copy:) keyEquivalent:@"c"];
  [editMenu addItemWithTitle: @"Paste" action:@selector(paste:) keyEquivalent:@"v"];
  [editMenu addItemWithTitle: @"Delete" action:@selector(delete:) keyEquivalent:@""];
  [editMenu addItemWithTitle: @"Select All" action:@selector(selectAll:) keyEquivalent:@"a"];
  [editMenu addItem:[NSMenuItem separatorItem]];
  NSMenuItem *findItem = [editMenu addItemWithTitle:@"Find" action:@selector(performTextFinderAction:) keyEquivalent:@"f"];
  [findItem setTag: NSTextFinderActionShowFindInterface];

  }

- (void) applicationWillFinishLaunching: (NSNotification *)notification {
[self buildMenu];
}

- (void) applicationDidFinishLaunching: (NSNotification *)notification {
}
@end

int main() {
NSApplication *application = [NSApplication sharedApplication];
AppDelegate *appDelegate = [[AppDelegate alloc] init];
[application setDelegate:appDelegate];
[application run];
return 0;
}

#导入
@接口文档:NSDocument{
NSWindow*窗口;
NSTextView*txtView;
}
-(无效)建筑窗;
@结束
@执行文件
-(id)init{
if(self=[super init]){
[自建窗口];
}
回归自我;
}
+(BOOL)autosavesInPlace{
返回YES;
}
-(NSData*)数据类型:(NSString*)类型名称错误:(NSError**)外部错误{
返回[[txtView string]dataUsingEncoding:NSUTF8StringEncoding];
}
-(BOOL)readFromURL:(NSURL*)类型的绝对URL:(NSString*)类型名称错误:(NSError**)outError{
NSString*str=[[NSString alloc]initWithContentsOfURL:absoluteURL编码:NSUTF8StringEncoding错误:outError];
[txtView设置字符串:str];
返回YES;
}
-(无效)构建窗口{
#定义_wndw780
#定义_wndh700
window=[[NSWindow alloc]initWithContentRect:NSMakeRect(0,0,wndW,wndH)
样式掩码:NSWindowsTyleMaskTitle | NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskClosable | NSWindowsTyleMaskResizeble
backing:NSBackingStoreBuffered defer:NO];
[窗口中心];
[窗口设置标题:@“测试窗口”];
[窗口级联topleftfrompoint:NSMakePoint(600,0)];
[window MakeKeyandDerfront:无];
//****需要窗口控制器****//
NSWindowController*windowController=[[NSWindowController alloc]initWithWindow:window];
[自添加windowController:windowController];
//******NSTextView带滚动条******//
NSScrollView*scrlView=[[NSScrollView alloc]initWithFrame:NSMakeRect(20,50,wndW-40,wndH-70)];
[[window contentView]添加子视图:scrlView];
[scrlView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
[scrlView setHasVerticalScroller:是];
txtView=[[NSTextView alloc]initWithFrame:NSMakeRect(0,0,wndW-40,wndH-70)];
[txtView setUsesFindBar:是];
[txtView setEditable:是];
[txtView setAllowsUndo:是];
txtView.automaticQuoteSubstitutionEnabled=否;
[scrlView setDocumentView:txtView];
//****退出btn****//
NSButton*quitBtn=[[NSButton alloc]initWithFrame:NSMakeRect(_wndW-50,5,40,40)];
[quitBtn setBezelStyle:nsbezelstyle循环];
[quitBtn setTitle:@“Q”];
[quitBtn setAutoresizingMask:NSViewMinXMargin];
[quitBtn setAction:@selector(terminate:)];
[[window contentView]添加子视图:quitBtn];
}
@结束
@接口AppDelegate:NSObject
-(void)构建菜单;
@结束
@实现AppDelegate
-(BOOL)应用程序应打开UntitledFile:(非应用程序*)发送方{
返回否;
}
-(void)构建菜单{
NSMenu*主菜单=[NSMenu new];
[NSApp setMainMenu:mainMenu];
//****应用程序菜单****//
NSMenuItem*appMenuItem=[NSMenuItem new];
[主菜单附加项:appMenuItem];
NSMenu*appMenu=[NSMenu new];
[应用菜单项设置子菜单:应用菜单];
NSString*appName=[[NSProcessInfo processInfo]processName];
NSString*aboutTitle=[@“About”stringByAppendingString:appName];
[appMenu addItemWithTitle:AboutTile action:@selector(orderFrontStandardAboutPanel:)keyEquivalent:@”“;
[应用菜单附加项:[NSMenuItem分隔项]];
[appMenu addItemWithTitle:@“退出”操作:@selector(terminate:)keyEquivalent:@“q”];
//*******文件菜单********//
NSMenuItem*fileMenuItem=[NSMenuItem new];
[主菜单附加项:fileMenuItem];
NSMenu*fileMenu=[[NSMenu alloc]initWithTitle:@“File”];
[文件菜单项设置子菜单:文件菜单];
[fileMenu addItemWithTitle:@“新建”操作:@选择器(新建文档:)键等效项:@“n”];
[fileMenu addItemWithTitle:@“打开…”操作:@selector(openDocument:)等效键:@“o”];
[文件菜单附加项:[NSMenuItem separatorItem]];
[fileMenu addItemWithTitle:@“Close”操作:@selector(performClose:)等效键:@“w”];
[fileMenu addItemWithTitle:@“保存”操作:@选择器(保存文档:)键等效项:@“s”];
[fileMenu addItemWithTitle:@“另存为…”操作:@selector(saveDocumentAs:)keyEquivalent:@”“;
//*********编辑菜单********//
NSMenuItem*editMenuItem=[NSMenuItem新建];
[主菜单附加项:编辑菜单项];
NSMenu*编辑菜单=[[NSMenu alloc]initWithTitle:@“编辑”];
[编辑菜单项设置子菜单:编辑菜单