有没有办法将不指向文件系统上存在的文件的项目添加到"打开最近"菜单?
在不基于NSDocument的应用程序中,我可以使用以下代码将项目添加到"打开最近"子菜单:
[[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:[NSURL URLWithString:stringToFilePath]];
Run Code Online (Sandbox Code Playgroud)
只要URL指向文件系统上存在的文件,它就可以按文档记录.
如果网址未指向系统上的文件(例如网址网址或自定义网址方案),则不会发生任何操作.
例如,即使我的应用程序处理URL中使用的方案,此代码也无效,并且在执行期间不生成日志:
[[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:[NSURL URLWithString:@"http://www.stackoverflow.com"]];
Run Code Online (Sandbox Code Playgroud)
更新:有人发现(很久以前)一种调整此菜单的方法,让它显示文件是否存在:http://lists.apple.com/archives/cocoa-dev/2007/Apr/msg00651.html
我成功地设法子类化NSDocumentController,但我从不调用我的方法 - (NSArray*)recentDocumentURLs.
这不是很令人惊讶,正如医生说的那样:
由于NSDocumentController的内部通常不使用它,因此这种方法不适合覆盖.
但该文件没有说明要使用什么,而海报没有提供更多细节.任何的想法?
如果没有解决方案,解决方法是从头开始重写整个菜单.如果可能的话,我宁愿避免这种情况,对于我免费获得的所有东西(比如当你有两个同名的项目时,它也会显示父目录以帮助区分它们).
我正在玩AppKit和NSDocument,我不知道为什么这不起作用?:
我刚刚写了这个,图像不是零,但从不加载任何图像,它的大小始终为零.这是我必须实现的将文件读入我的文档的正确方法吗?我需要路径,而不是数据(NSData),因为我打算使用其他库来读取其他文件.
现在我正在尝试阅读PNG,JPG,没有工作.(
- (BOOL) readFromURL:(NSURL *)url ofType:(NSString *)typeName error:(NSError **)outError{
NSImage *image = nil;
image = [[NSImage alloc] initWithContentsOfURL:url];
[imageView setImage:image];
[image release];
if ( outError != NULL ) {
*outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:NULL];
}
return YES;
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我正在制作一个应用程序,为我学校的人们创建课程时间表.这是我为应用程序考虑的粗略设计:
我希望我的NSDocument子类代表个人的时间表.这个想法是他们打开一个文档,并可以将池中的课程添加到他们的时间表,然后保存,共享,打开等.所以时间表将存储在用户选择的外部文件中.
我想使用CoreData存储学生可以选择的所有课程.这些不会随着时间表的创建和编辑而改变,而是可能仅在启动应用程序时检查课程信息的更新.
这似乎是构建我的应用程序的合理方式.问题是,当我创建一个基于NSDocument的应用程序并选中该use CoreData框时,它使其成为一个基于NSPersistentDocument的应用程序,而不是使其成为基于NSDocument的应用程序和CoreData工具.
我不认为这是我想要的行为.有没有办法使用CoreData,但仍然有一个基于NSDocument的应用程序?或者NSPersistentDocument毕竟我应该使用什么?我是否误解了整个NS*Document业务?您对我的应用程序结构有什么建议吗?
谢谢你的帮助!
搜索这篇文章的标题后发现它很常见; 的确,我从Xcode那里得到了这个错误.但我似乎无法找到任何修复.我现在在运行程序时看到它,它似乎发生在调用changeCountTokenForSaveOperation期间或之后.它似乎与撤销管理器有关,而不是与我使用核心数据这一事实相关,但我可能错了.
有谁知道是什么导致这个或如何解决它?
如何NSDocument以一种格式将另一种格式导出为另NSDocument一种格式?
我想在我的基于文档的应用程序中实现典型的导出选项.我不确定我应该在哪里放置格式转换代码,以及Cocoa已经提供的内容.
所以在谷歌搜索后,我的理解是,当我在基于NSDocument的应用程序中使用捆绑包作为我的文档时,我必须在每次要保存时编写整个捆绑包?由于我正在向文档中添加大量视频文件,因此这开始出现问题.
有没有办法解决这个问题而不抛弃NSDocument?
我有很多iOS经验,但Cocoa让我有些困惑.我阅读了几篇关于Cocoa的Apple文档,但仍然有一些我在任何地方都找不到的细节.看来文档是在基于NSDocument的Xcode模板更新为使用NSViewController之前编写的,所以我不清楚我应该如何组织我的应用程序.该模板使用NSWindow NSViewController创建一个故事板.
我的理解是我应该将NSWindowController或NSWindow子类化为对我的模型对象的引用,并在makeWindowControllers()中设置它.但是,如果我想使用NSViewController而不是只是将所有内容放在窗口中,我还需要以某种方式访问我的模型.我注意到在我的视图控制器中有一个叫做RepresentObject的东西,它似乎意味着要保存一些模型对象(然后被强制转换),但它总是为零.这是如何设置的?
我发现很难正确地提出这个问题,但我想我的问题是:如何在基于文档的应用程序中正确使用NSViewController?
PS:我知道NSWindowController通常用于管理多个窗口,这些窗口作用于一个文档,所以假设我只需要一个窗口,那么我就不需要NSWindowController.但是,要求可能会改变,从长远来看使用NSWindowController可能会更好,对吧?
cocoa nsdocument nsviewcontroller nswindowcontroller xcode-storyboard
有没有人有任何他们想分享的NSDocument利弊?
特别是:
一旦依赖NSDocument架构,如果需要,难以重构吗?
是否有性能影响?
它会以某种/多种方式限制你吗?
我正在构建我的第一个严肃的Cocoa应用程序.它是一个基于文档的应用程序,使用Core Data进行持久存储.使用Xcode"新项目"模板选项,我的项目开始时使用了几个默认类:
我从那里接受了设计并且它的工作都相当不错,但是通过另一个问题,我遇到了一个我不知道的Cocoa类NSDocumentController.该类显然提供了用于管理基于文档的应用程序中的文档类的默认逻辑.
我的问题是这个类如何进入我的应用程序 - 如果有的话 - 我是否需要它?此时,我使用EventDocument类作为一种顶级控制器.它从菜单中选择用户选择(带有iTunes选项的树形视图),调出处理这些选项的不同视图/控制器并传递托管对象上下文.如果NSDocumentController是"走的路",为什么Apple不会将其作为项目模板的一部分生成?
我有一个基于文档的可可应用程序,它打开一个 .md 文件,以良好的格式显示降价内容。如果我在另一个应用程序(例如 textedit)中更改 .md 文件,我想在我的应用程序中重新加载视图。
这是我迄今为止所做的工作:
import Cocoa
class Document: NSDocument {
var fileContent = "Nothing yet :("
override init() {
// Add your subclass-specific initialization here.
super.init()
}
override class var autosavesInPlace: Bool {
return false
}
override func makeWindowControllers() {
// Returns the Storyboard that contains your Document window.
let storyboard = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: nil)
let windowController = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("Document Window Controller")) as! NSWindowController
self.addWindowController(windowController)
}
override func data(ofType typeName: String) throws -> Data {
throw …Run Code Online (Sandbox Code Playgroud) nsdocument ×10
cocoa ×9
macos ×6
xcode ×2
bundle ×1
core-data ×1
menu ×1
nsimage ×1
objective-c ×1
swift ×1