NSSavePanel没有保存在桌面上?

时间:2013-01-10 10:57:44

标签: objective-c cocoa

我可以使用NSSavePanel和沙盒OS X应用程序让用户保存在桌面上吗?我给了用户下载和用户选择文件夹的读/写权限,由于某种原因,我的应用程序保存在下载文件夹中,但是当我更改目录并选择桌面时它根本不保存。

这是我用于NSSavePanel的代码

if([self.mActiveQRFileName isEqualToString:kQR_DEFAULT_FILE_NAME])
    {
        NSSavePanel *savePanel = [NSSavePanel savePanel];
        //[savePanel setDirectoryURL:[NSURL URLWithString:[Utilities getQRDefaultDirectoryPath]]];
        [savePanel setNameFieldStringValue:kQR_DEFAULT_FILE_NAME];
        [savePanel beginSheetModalForWindow:[self window] completionHandler:^(NSInteger result) {
            if (result == NSFileHandlingPanelOKButton) {
                NSString *qrFilePath = [NSString stringWithFormat:@"%@.%@",[[savePanel URL] path],kQR_FILE_EXT];

                [qrd saveQRFile:qrFilePath];
                self.mActiveQRFileName = [NSString stringWithString:qrFilePath];
                blnChangesSaved = YES;
            }
        }];
    }
    else
    {
        [qrd saveQRFile:self.mActiveQRFileName];
        blnChangesSaved = YES;
    }

非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:3)

NSSavePanel会为用户选择URL属性中文件的路径。沙盒将仅授予您访问此文件的权限,其名称由用户指定。

在您的示例代码中,此行可能通过为其提供不同的文件扩展名来修改所选路径:

NSString *qrFilePath = [NSString stringWithFormat:@"%@.%@",[[savePanel URL] path],kQR_FILE_EXT];

这可能会导致文件名与您在沙箱中无权访问的原始文件不同。尝试记录qrFilePath并查看它是否仍然等于所选URL的路径。还要检查沙箱异常以查看确切的错误。

如果您想限制NSSavePanel让用户只指定某种类型的文件,请使用setAllowedFileTypes:方法。

如果您希望用户授予您对可以输出任何文件的目录的访问权限,而不是特定路径:使用NSOpenPanel。这样做的缺点是用户无法像NSSavePanel中那样指定特定的文件名。