- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个(当前)根本不使用任何 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/
为了我们公司的 SEO 需求,我们需要通过 301 将一些 SEO URL 更改为另一个 URL。 示例: /seo/keywords-1-2-3/ 到 /seo/mynew301page-1-2-3
使已经开发的 Vue 应用程序对 SEO 友好的最简单方法是什么(搜索引擎可以读取所有标题元标记)。 我已经研究过 NUXT,我将不得不再次重新构建整个过程,而且除了 SSR(服务器端渲染)部分之外,
我正在使用 Azure 数据库进行一些数据库管理,我需要执行查询,例如删除数据库中的所有约束。 sp_MSForEachTable 在使用 Azure 数据库时不可用,因此我正在采用不同的方法来实现此
在我的研究中,我发现了 2 种方法。 两者都需要修改 Global.Asax 中的 Application_BeginRequest 过程,您可以在其中运行代码来进行实际的 URL 映射(我的数据库
例如我有这个字符串: make no@ sen# `se ! 我会像这样生成 url make-no-sen-se! 我有这个: var value = $('.titleVal').val(
我有一个网站,我想开始使用友好的 URL。 所以不是: http://server.com/company.php?id=12 我可以使用: http://server.com/company/ste
我正在用 pandas 编写一些数据分析管道。我一直在使用的数据框中的一列是由自定义编写的类的对象组成的,每个类都用一个字符串初始化,我用正则表达式从中读取各种信息并存储在对象的属性中。子类结构类似于
这个问题已经存在: C++ create new windows command [closed] 关闭 4 年前。 我正在尝试创建一个 C++ 控制台应用程序并创建新命令。 我想做的事的例子:在终
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
我一直在尝试为 prestashop 中的产品创建第二个 url 重写选项.在 SEO 和 URL 部分的标准 Prestashop 安装中,我得到了以下产品 url 构建: {category:/}
我在使用重写引擎通过友好的 url 实现我的目标时遇到了一些问题。 基本上我有以下结构:- 索引.php - 吃下 - index.php 我在主索引中的链接是这样的:下载/index.php?dow
我真的不喜欢在链接中使用选择/选项元素: 但是他们已经找到了作为一种选择进入设计师组合的方式,并尽我所能劝阻他们不要使用它们,我知道如果没有谷歌的力量,我会输掉这场战斗,而且“这对 SEO 不利”。
dispose: function() { var disposer; while (disposer = this._disposers.shift()) { // expected
我将 Heroku 应用程序上的自定义域更改为新域。现在我将创建一个新的 Heroku 应用程序,它的唯一目的是重定向到第一个应用程序。 我在 Google Webmasters 中读到我应该像这样进
我有一个类。这个类有2个字段。 我有一个整数数组。我的任务是重载友好的“+”运算符,以便可以将数组中的字段值与数组元素的值相加。 例如: class Test { public: double
这个问题在这里已经有了答案: Encode URL in JavaScript (22 个答案) 关闭 9 年前。 您好,我有这个 URL(顶部),我正在尝试与“pinterest”一起使用,他们会
jQuery 模式对话框 seo 友好吗?如果不是,我们可以进行哪些更改,以便爬虫可以轻松读取模态对话框中的内容? 提前致谢。 编辑:抱歉忘记提及模式中的内容来自服务器端。所以它也使用 ajax。 最
这是我的 main.js 文件: jQuery(function($) { $('LI.tree-item-name').has('ul').click(function() { if (
static func randomShape() -> Shape { // Find out count of possible shapes var maxValue = 0
我正在构建一个通过 index.php 运行所有代码的网站。 例如 index.php?controller=something&id=01234。 我想使用 PHP 创建友好的 URL,所以我这样做
我是一名优秀的程序员,十分优秀!