如何从默认的“另存为”对话框中获取文件URL?我正在使用基于文档的应用程序与Xcode中的Snow Leopard 10.6 SDK。
我已经浏览了互联网和Apple文档两天,并且只找到了使用“另存为”对话框工作表的唯一实例的答案;每个人似乎都希望通过制作自己的文件来重新发明轮子 - >保存功能,但这不是我想做的 - 我已经做到了!
例如,我不想使用这种方法,我不想在-(void)saveDocumentAs:sender
中使用以下内容替换默认NSDocument
:
- (IBAction)saveFileAs:(id)sender
{
NSSavePanel *spanel = [NSSavePanel savePanel];
[spanel setCanCreateDirectories:YES];
[spanel setCanSelectHiddenExtension:YES];
[spanel setAllowedFileTypes:[[self currentDocument] writableTypesForSaveOperation:NSSaveAsOperation]];
[spanel setTreatsFilePackagesAsDirectories:YES];
[spanel beginSheetModalForWindow: [[[[self currentDocument] windowControllers] objectAtIndex:0] window] completionHandler:^(NSInteger result)
{
if (result == NSFileHandlingPanelOKButton)
{
NSString *type = [[self currentDocument] fileTypeFromLastRunSavePanel];
NSLog(@"%@", type);
NSURL *saveURL = [spanel URL];
NSLog(@"%@", saveURL);
[[self currentDocument] dataOfType:type error:nil];
}
}];
}
相反,我想要的只是用户从默认NSSavePanel
表单中为其文件选择的文件URL。因为,正如您在此测试中看到的那样,fileTypeFromLastRunSavePanel
在块中不起作用,因此它要么使用默认保存面板而不是文件URL获取文件类型,要么从自定义保存中获取文件URL面板,而不是文件类型...至少不与fileTypeFromLastRunSavePanel
。
编辑:我在NSDocument子类的
中尝试了[self fileURL]
- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError
方法,但除非文档已保存到磁盘,否则返回null。
编辑2:只是为了明确说明我在这里要问的内容,如何从默认的NSSavePanel savePanel获取用户选择的URL,而不是我自己的NSSavePanel的savePanel实例?我能做什么这没有创建NSSavePanel的子类并重写其方法?我认为有必要为用户在默认savePanel中选择的文件提供某种URL引用,而不必将该功能添加到您自己的NSSavePanel实例。
答案 0 :(得分:3)
NSSavePanel *panel = [NSSavePanel savePanel];
[panel setMessage:@"Please select a path to create a new database."]; // Message inside modal window
[panel setAllowedFileTypes:[[NSArray alloc] initWithObjects:@"sqlite3", @"sqlite", @"db", nil]];
[panel setAllowsOtherFileTypes:YES];
[panel setExtensionHidden:NO];
[panel setCanCreateDirectories:YES];
[panel setTitle:@"Create a database"]; // Window title
[panel setNameFieldStringValue:@"Untitled.sqlite3"];
[panel beginWithCompletionHandler:^(NSInteger result){
if (result == NSFileHandlingPanelOKButton) {
path = [[panel URL] path];
url = [panel URL];
}
}];
答案 1 :(得分:1)
没有“默认”NSSavePanel这样的东西。您需要创建自己的实例。
答案 2 :(得分:0)
如果您查看NSSavePanel
reference documentation,则会清楚地显示URL
方法,其中指出:
返回当前在面板中显示为URL的文件的绝对路径名。
这是我在搜索引擎中输入“NSSavePanel”时出现的第一个结果。
答案 3 :(得分:0)
请注意,-[NSSavePanel savePanel]
与许多类似的Cocoa API并不一样,它返回一个唯一的实例。您必须将对保存面板实例的引用存储在变量中,并在配置保存面板属性时访问它。单击保存按钮时,您还可以访问同一保存面板实例的URL属性。