Установка NSRecentDocumentsMenu для песочницы без пера - PullRequest
0 голосов
/ 22 марта 2020

Я работаю над проектом, который (в настоящее время) вообще не использует никаких nib-файлов.

Я пытаюсь выяснить, есть ли способ добавить меню NSRecentDocumentsMenu Open Recent, которое не ' Мне не нужно использовать частный API.

Ссылка ниже - это все, что мне удалось найти: http://lapcatsoftware.com/blog/2007/07/10/working-without-a-nib-part-5-open-recent-menu/

Может кто-нибудь предложить свои идеи?

1 Ответ

0 голосов
/ 22 марта 2020

Я пытаюсь выяснить, есть ли способ добавить меню NSRecentDocumentsMenu Open Recent, которое не требует использования частного API.

Следующая ссылка предназначена для основанное на документе приложение в быстром без использования перьев:

https://www.dropbox.com/s/cfvsz11oe00lnp5/DocBased_swift.zip?dl=0

Используется модификация кода меню, найденного в этой ссылке:

https://talk.objc.io/episodes/S01E145-setting-up-a-document-based-app

Демонстрация может быть запущена в Xcode путем создания приложения macOS с использованием swift и интерфейса XIB, хотя мы не будем использовать XIB. Создайте новый файл с именем main.swift и удалите существующий класс AppDelegate. Скопируйте / вставьте найденный выше исходный код в файл main.swift (используйте импорт Какао вместо Foundation). Когда вы нажмете кнопку «Выполнить», вы заметите, что меню отображаются серым цветом, и пункт меню «Открыть недавно» отсутствует. Чтобы это исправить, добавьте класс и роль Cocoa NSDocument в info.plist (см. Изображение в папке выше). Класс NSDocument Какао должен быть nameOfYourApp.Document для быстрого или просто Document для obj c. Если нажать кнопку «Выполнить» после внесения этих дополнений, у вас должно появиться приложение на основе документов с работающим пунктом меню «Открыть недавно». Пожалуйста, оставьте сообщение, если возникнут проблемы.

Obj c Исходный код находится здесь:

https://www.dropbox.com/s/dvs1u6lpk4l5xhq/DocBased_objc.zip?dl=0

Инструкции аналогичны инструкциям для swift, за исключением того, что приложение macOS создается с использованием target- c Скопируйте / вставьте исходный код в main.m после удаления того, что предоставил Xcode. Для простоты также удалите AppDelegate и класс Document (если вы установили «Document based» в настройке), хотя вы можете использовать их по своему желанию. В список 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;
}

Невозможно опубликовать изображение plist. К сожалению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...