gpt4 book ai didi

objective-c - 基于文档的 OSX 应用程序 - 将打开文档的数量限制为一个

转载 作者:行者123 更新时间:2023-12-03 17:34:46 25 4
gpt4 key购买 nike

我试图弄清楚如何将我的基于 NSDocument 的应用程序一次限制为一个打开的文档。它很快就会变得一团糟。

有人能够以简单可靠的方式做到这一点吗?

////编辑////我希望能够提示用户保存现有打开的文档并在创建/打开新文档之前将其关闭。

////编辑2如果打开任何文档,我现在尝试仅返回带有适当消息的错误 - 但是,错误消息不显示我的 NSLocalizedKeyDescription。这是在我的 NSDocumentController 子类中。

-(id)openUntitledDocumentAndDisplay:(BOOL)displayDocument error:(NSError **)outError{


if([self.documents count]){

NSMutableDictionary* dict = [NSMutableDictionary dictionaryWithObject:@"Only one document can be open at a time. Please close your document." forKey:NSLocalizedDescriptionKey];

*outError = [NSError errorWithDomain:@"Error" code:192 userInfo:dict];

return nil;
}
return [super openUntitledDocumentAndDisplay:displayDocument error:outError];
}

最佳答案

这不是一个简单的解决方案,因为它是一个非常复杂的类,但我建议您对 NSDocumentController 进行子类化并注册自己的解决方案,这将禁止打开超过一定数量的文档。这将允许您阻止诸如通过将文件拖放到扩展坞中的应用程序图标上或在查找器中打开文件来打开文件之类的事情,这两种方法都会绕过打开菜单项。

当您已经打开文档时,您仍然需要覆盖 GUI/菜单激活代码以防止 Open... 可用,但这只是为了确保您不会混淆用户。

您的文档 Controller 需要在任何其他文档 Controller 之前创建,但这很容易通过在 MainMenu.xib 中放置一个 DocumentController 实例并确保该类来实现设置为您的子类。 (这将导致它调用 -sharedDocumentController,这将创建您的实例。)

然后,在您的文档 Controller 中,您需要覆盖:

- makeDocumentForURL:withContentsOfURL:ofType:error:
- makeUntitledDocumentOfType:error:
- makeDocumentWithContentsOfURL:ofType:error:

检查文档是否已打开并返回 nil,将错误指针设置为新创建的错误,该错误显示相应的消息 (NSLocalizedDescriptionKey)。

这应该能够处理拖放、applescript 等情况。

编辑至于您在打开事件时额外请求关闭/保存提示,这是一个更棘手的问题。你可以:

  1. 保存信息(基本上是 make 请求的参数)
  2. 发送 -closeAllDocumentsWithDelegate:didCloseAllSelector:contextInfo:,其中 self 作为委托(delegate),新创建的例程作为选择器
  3. 收到选择器后,请清除已保存的参数,或使用您保存的参数重新执行命令。

请注意,步骤 2 和 3 可能需要使用 performSelector 延迟完成

我自己还没有尝试过(其余的我之前已经做过),但看起来应该可行。

关于objective-c - 基于文档的 OSX 应用程序 - 将打开文档的数量限制为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15993277/

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