设置 NSDocument 以保存非本机类型

Posted

技术标签:

【中文标题】设置 NSDocument 以保存非本机类型【英文标题】:Setting up NSDocument for saving a non-native type 【发布时间】:2013-12-23 16:05:33 【问题描述】:

我的应用程序有一个自定义格式,它在 Info.plist 中注册为编辑器,并且可以读取和写入该格式。它还可以读取许多其他格式,但不能写入它们。对于这些格式,它在 Info.plist 中注册为查看器。

当我打开其他格式之一时,一切似乎都很好,但是当我保存文件时,我的 NSDocument 会发送消息writeToURL:ofType:error:,其中包含我加载的文件的 URL,类型为格式的 UTI我不会写。

-(NSArray *)writableTypes 只返回我的自定义格式的 UTI,-(BOOL)isNativeType: 只返回我自定义格式的 UTI 的 YES。

我想做的是,就像其他具有本机格式但可以从其他格式读取的应用程序一样,当用户按下保存时,保存面板被打开并且用户选择一个文件名来保存为本机类型。

这是 NSDocument 可以自己做的事情,还是我需要签入writeToURL:ofType:error: 看看我是否需要手动打开保存面板?

【问题讨论】:

【参考方案1】:

回答我自己,我发现似乎可行的解决方案是在 readFromURL:ofType:error: 中为非本地格式重置 NSDocument 的 fileURL、displayName 和 fileType。

- (BOOL)readFromURL:(NSURL *)url ofType:(NSString *)type error:(NSError **)error

    // Handle loading as normal

    if (![type isEqualToString:kMyNativeType]) 
        [self setFileType:kMyNativeType];
        [self setFileURL:nil];

        // Without this, all non-native files are displayed as Untitled.
        // This sets the window title as the filename without the extension
        NSArray *filenameComponents = [[url lastPathComponent] componentsSeparatedByString:@"."];
        [self setDisplayName:filenameComponents[0]];
    

    return YES;

我不知道这是否是正确的方法,但它似乎适用于我目前想要的,并且似乎是 https://developer.apple.com/library/mac/documentation/DataManagement/Conceptual/DocBasedAppProgrammingGuideForOSX/AdvancedTopics/AdvancedTopics.html#//apple_ref/doc/uid/TP40011179-CH7-SW8 中建议的方法

【讨论】:

谢谢!这对我有帮助。 也可以在不使用 NSArray 的情况下删除窗口标题中的文件扩展名。像这样的东西: NSString *filenameWithoutExtension = [[url lastPathComponent] stringByDeletingPathExtension]; 答案是正确的方法,但值得指出(对于那些使用readFromData(data: NSData, ofType typeName: String)的人)你必须在设置fileURL = nil之后setDisplayName

以上是关于设置 NSDocument 以保存非本机类型的主要内容,如果未能解决你的问题,请参考以下文章

尽管启用了本机代码调试,但是仍无法从托管调试本机代码

从 NSObject 获取 NSDocument

OS X 沙盒中的非就地保存

使用 NSDocument 打开任何文件夹

使用 NSDocument 时如何隐藏保存面板

从“NSDocument 即将关闭工作表”截取保存