问题标签 [nsdocument]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
262 浏览

cocoa - Cocoa 应用程序的文档相关操作应该在哪里实现?

我正在编写一个基于文档的 Cocoa 应用程序,它基本上是一个图形编辑程序。我希望用户能够显示/隐藏非模态窗口(例如检查器窗口)。由于这些窗口将在菜单项中显示/隐藏,因此执行操作的“最佳”位置在哪里,例如- (IBAction)toggleInspector:(id)sender

我已经看到,在 Sketch 示例代码中,这些是在应用程序委托中实现的,并且窗口控制器实例也保留在那里,但感觉比最“优雅”的地方更方便放置它。此外,由于此检查器仅在文档打开时才相关,因此感觉它应该更多地与文档的主文件相关联而NSWindowController不是应用程序。

0 投票
1 回答
702 浏览

objective-c - 让用户选择打开什么类型的文档

我正在创建一个具有两种文档类型的 NSDocument 应用程序:网站和 Web 服务。这是在我的 Info.plist 中:

现在,每当用户打开应用程序,从菜单栏中选择“新建”项,或者在没有打开的窗口时单击 Dock 图标,我想显示一个带有两个选项的窗口,每个选项对应一种文档类型。谁能帮我这个?谢谢

0 投票
1 回答
215 浏览

objective-c - 我是否需要在仅作为文件查看器的应用程序的子类中覆盖 NSDocument 的编写方法

我想我可能错过了显而易见的事情,但我不确定。

文档中关于子类化 NSDocument的部分指出NSDocument 的子类必须覆盖一种读取和一种写入方法。

如果我正在创建一个不会写回任何内容的查看器应用程序,我是否还需要重写一个写入方法(返回什么,nil?)或者我可以忽略它并确保没有可以调用的保存方法?

0 投票
1 回答
66 浏览

objective-c - 将数据发送到全球 hud、Cocoa 的概念性帮助

我有一个多文档应用程序。

我想从每个文档中提取数据,并将数据的子集镜像到可以位于另一个屏幕上的全局“管理”HUD 窗口中。

我是否需要在每个文档实例中使用 HudController 的全局对象,或者有没有办法可以将各种文档中的所有信息作为其自己的实例委托给 HudController?

谢谢你的帮助!

0 投票
1 回答
1001 浏览

cocoa - NSDocument 子类没有被 NSWindowController 关闭?

好的,我对 Cocoa 和 Objective-C 以及一般的 OOP 还很陌生。

作为背景,我正在开发一个可扩展的编辑器,它将用户的文档存储在一个包中。这当然需要一些“乐趣”来解决一些问题NSFileWrapper(即有点偷偷摸摸的编写和加载过程,以避免NSFileWrappers为包中的每个文档制作)。我得到的解决方案本质上是将我的NSDocument子类视为只是一个外壳——使用它来为捆绑包创建文件夹,然后将文档的实际内容传递给其他方法。

不幸的是,在某些时候,我似乎完全搞砸了狗。我不知道这是怎么发生的,但是关闭文档窗口不再释放文档。即使窗口成功关闭,文档对象似乎也没有收到“关闭”消息或任何相关消息。

最终结果是,如果我启动我的应用程序,创建一个新文档,保存它,然后关闭它,然后尝试重新打开它,文档窗口永远不会出现。通过一些创造性的子类化和NSLogging,我设法弄清楚文档对象仍在内存中,并且仍然附加到NSDocumentController实例,因此尝试打开文档从未通过NSDocumentController's“嗯,当前打开那个”检查。

我确实有一个NSWindowControllerNSDocumentController实例,但我已经完全从我的项目中清除了它们。我已经覆盖了几乎所有NSDocument试图找出问题所在的方法。据我所知,我的 Interface Builder 绑定都是正确的——主菜单中的“关闭”附加到performClose:第一响应者等,我也尝试过使用新的未受污染的 MainMenu 和 Document xibs。

我认为我的捆绑编写代码可能有些奇怪,所以我基本上将其全部删除并从头开始,但这似乎不起作用。我拿出我的-init方法覆盖,这也没有帮助。我在这里没有任何简单文档应用程序的来源,所以我没有尝试下一个合乎逻辑的步骤(在readFromUrlandwriteToUrl方法中用已知的工作代码替换我的代码)。

我已经在大约 16 个小时的不间断故障排除中遇到了这个问题,不用说,我已经走到了尽头。如果我想不通,我想我会从头开始尝试这个项目,使用更多的代码和基于捆绑文档混乱的强度。

0 投票
1 回答
371 浏览

iphone - iPhone 上的 BNRPersistence 和 NSDocument

我试图让 BNRPersistence 在 iPhone 应用程序中运行,但我遇到了一个我不知道如何解决的问题。请记住,我对 iPhone 开发人员比较陌生。

问题是 BNRStoreDocument 是 NSDocument 的子类,它存在于 Cocoa 框架中,因此在 iPhone 上不可用。所以很明显我遇到了无法找到 NSDocument 的编译错误。BNRPersistence 的开发者表示它可以在 iPhone 上运行,所以我确定有一个解决方案,我只是不知道它是什么。

任何帮助将不胜感激!

0 投票
2 回答
86 浏览

cocoa - 如何将 PersistentDocuments 加载到同一窗口中

我想打开 NSPersistentDocuments 并将它们一次加载到同一个窗口中。我快到了,但缺少一些步骤。希望有人可以帮助我。

我在硬盘上保存了一些文件。在启动时,我的应用程序会打开一个未命名的 NSPersistentDocument 并创建一个单独的 NSWindowController。当我按下按钮从硬盘驱动器加载文件 1 时,数据出现在字段中,但我可以看到有两件事是错误的:

1)更改数据不会使文档变脏
2)选择保存更新持久存储(我知道这一点,因为当我再次打开文件时,我看到了更改)但我收到错误:+entityForName:找不到 NSManagedObjectModel实体名称“书”

这是我的代码,它位于最初使用无标题文档启动的 WindowController 中。这段代码并不完美。例如,我知道我应该在加载新文档之前处理 PendingChanges 并保存当前文档。这是试图克服这个障碍的测试代码。

谢谢!

0 投票
2 回答
545 浏览

objective-c - 如何同时保存 NSDocument?

我有一个基于文档的应用程序。保存文档可能需要几秒钟,所以我想让用户在后台保存文档时继续使用该程序。

由于文档架构,我的应用程序被要求保存到一个临时位置,然后将该临时文件复制到旧文件上。但是,这意味着我不能只在后台运行我的文件保存代码并在完成之前返回,因为必须先完全写入临时文件才能复制它。

有没有办法禁用这种临时文件行为或以其他方式在后台启用文件保存?

0 投票
2 回答
1175 浏览

cocoa - 创建或打开新文档时如何关闭 NSPanel?

我正在开发一个基于文档的 Cocoa 应用程序。启动时,用户会看到一个“欢迎面板”(类型为NSPanel),其中包含用于“创建新文档”和“打开现有文档”等常见操作的按钮。这些动作分别链接到第一响应者newDocument:openDocument:动作,就像文件菜单中的匹配项一样。

一切都按预期工作......有三个警告:

  1. 创建或打开新文档时,欢迎面板不会关闭。
  2. 文档窗口在创建时没有焦点。
  3. 打开的文档窗口没有窗口标题栏中显示的打开文件;同样,不会像预期的那样创建带有“Untitled”、“Untitled 2”、“Untitled 3”等标题的新文档窗口。(我提到这一点不仅是因为它很烦人,而且因为它可能会产生一些对出了什么问题的洞察力。)

通过使我的应用程序控制器成为欢迎面板的代表,我已经部分解决了 #1。单击“打开现有文档”按钮时,面板将退出其键状态(因为正在打开文件浏览器对话框),因此我可以在委托的windowDidResignKey:方法中关闭面板。但是,我不知道在创建新文档时如何关闭面板,因为在创建新文档时找不到发布的通知或调用的委托方法。最终,#2 仍然是一个问题,因为文档窗口在创建时没有获得焦点。

我只有子类NSDocument——我根本没有使用自定义文档或窗口控制器。我也尝试将面板更改为 an NSWindow,认为 an 的NSWindow行为可能有所不同,但同样的问题正在发生。

0 投票
1 回答
3562 浏览

cocoa - 将不指向文件的项目添加到“打开最近”菜单

有没有办法将不指向文件系统上存在的文件的项目添加到“打开最近”菜单?

在不基于 NSDocument 的应用程序中,我可以使用以下代码将项目添加到“打开最近”子菜单:

只要 URL 指向文件系统上存在的文件,它就可以按文档说明工作。

如果 url 不指向系统上的文件,例如 web url 或自定义 url 方案,则不会发生任何事情。

例如,这段代码没有任何效果,并且在执行过程中不会产生日志,即使我的应用程序处理了 URL 中使用的方案:

更新:有人(很久以前)找到了一种方法来调整这个菜单,让它显示文件是否存在:http: //lists.apple.com/archives/cocoa-dev/2007/Apr/msg00651.html

我成功地继承了 NSDocumentController,但是我对方法的覆盖 - (NSArray *)recentDocumentURLs 从未被调用。

正如医生所说,这并不奇怪:

由于 NSDocumentController 的内部通常不使用它,因此这种方法不是一个好覆盖的方法。

但是文档没有说明要使用什么,海报也没有提供更多细节。任何想法?


如果没有解决方案,解决方法是从头开始重写整个菜单。如果可能的话,我宁愿避免这种情况,因为我免费获得的所有东西(比如当你有两个同名的项目时,它也会显示父目录以帮助区分它们)。