Я пытаюсь выяснить, есть ли способ добавить меню 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. К сожалению.