Objective c 设置NSDocument以保存非本机类型

Objective c 设置NSDocument以保存非本机类型,objective-c,cocoa,nsdocument,Objective C,Cocoa,Nsdocument,我的应用程序有一个自定义格式,它在Info.plist中注册为编辑器,可以读取和写入该格式。它还可以读取许多其他格式,但不能写入。对于这些格式,它在Info.plist中注册为查看器 当我打开另一种格式时,一切看起来都很好,但是当我来保存文件时,我的NSDocument会被发送消息writeToURL:ofType:error:,其中包含我加载的文件的URL,类型是我无法写入的格式的UTI -(NSArray*)writableTypes仅返回我的自定义格式的UTI,-(BOOL)isNativ

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

当我打开另一种格式时,一切看起来都很好,但是当我来保存文件时,我的NSDocument会被发送消息
writeToURL:ofType:error:
,其中包含我加载的文件的URL,类型是我无法写入的格式的UTI

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

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


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

回答自己,我发现似乎有效的解决方案是在
readFromURL:ofType:error:
中重置
NSDocument
的文件URL,显示非本机格式的名称和文件类型

- (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;
}

我不知道这是否是正确的方法,但它似乎适合我目前想要的,并且似乎是在回答我自己时所建议的,我发现似乎有效的解决方案是在
readFromURL:ofType:error:
中重置
NSDocument
的文件URL,显示非本机格式的名称和文件类型

- (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;
}

我不知道这是否是正确的方法,但它似乎适合我目前想要的,并且似乎是

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