gpt4 book ai didi

objective-c - 不带 Nib 的 NSRecentDocumentsMenu 的沙箱友好安装

转载 作者:行者123 更新时间:2023-12-03 18:07:36 24 4
gpt4 key购买 nike

我正在开发一个(当前)根本不使用任何 nib 文件的项目。

我试图弄清楚是否有任何方法可以添加不需要使用私有(private) API 的 NSRecentDocumentsMenu 打开最近菜单。

以下链接是我迄今为止找到的所有链接: http://lapcatsoftware.com/blog/2007/07/10/working-without-a-nib-part-5-open-recent-menu/

有人可以提供见解吗?

最佳答案

I'm trying to figure out whether there is any way to add the NSRecentDocumentsMenu Open Recent menu that doesn't require use of a private API.

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

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

它使用此引用中找到的菜单代码的修改:

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

该演示可以通过使用 swift 和 XIB 接口(interface)创建 macOS 应用程序在 Xcode 中运行,尽管我们不会使用 XIB。创建一个名为 main.swift 的新文件并删除现有的 AppDelegate 类。将上面找到的源代码复制/粘贴到 main.swift 文件中(使用 import Cocoa 而不是 Foundation)。当您点击“运行”按钮时,您会注意到菜单呈灰色,并且没有“打开最近的”菜单项。要解决此问题,请务必将 Cocoa NSDocument 类和角色添加到 info.plist(请参见上面文件夹中的图像)。 Cocoa NSDocument 类应该是 swift 的 nameOfYourApp.Document 或 objc 的普通文档。当添加这些内容后点击“运行”按钮时,您应该有一个基于文档的应用程序,其中包含一个功能正常的“打开最近的”菜单项。如有问题请留言跟进。

Objc源代码在这里:

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

说明与 swift 的说明类似,但 macOS 应用程序是使用 Objective-C 创建的。删除 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;
}

无法发布 plist 的图像。抱歉。

关于objective-c - 不带 Nib 的 NSRecentDocumentsMenu 的沙箱友好安装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60793919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com