2012-05-22 238 views
8

沙盒应用程序为Mac App Store后,保存字符串文件为NSSavePanel时出现问题。我将com.apple.security.files.user-selected.read-write设置为YES,并且NSOpenPanel正常工作。沙盒应用程序沙盒后NSSavePanel未保存文件

当我尝试保存新文件,不过,似乎一切正常,但随后没有保存的文件,它应该是....

这是我用来保存代码该文件:

NSSavePanel *save = [NSSavePanel savePanel]; 

long int result = [save runModal]; 

if (result == NSOKButton) 
{ 
    NSString *selectedFile = [save filename]; 
    NSString *fileName = [[NSString alloc] initWithFormat:@"%@.dat", selectedFile]; 
    NSString *arrayCompleto = [[NSString alloc]initWithFormat:@"bla bla bla"]; 
    [arrayCompleto writeToFile:fileName 
        atomically:NO 
         encoding:NSUTF8StringEncoding 
         error:nil]; 
} 

回答

10

首先,-[NSSavePanel filename]选择器已被弃用。改为使用-[NSSavePanel URL]。其次,-[NSString writeToFile:atomically:encoding:error]告诉你你做错了什么是error:(NSError**)的论点。

您还应该特别处理文件I/O的错误,因为即使您的代码是100%正确的,用户系统上仍可能存在错误(权限不足等),并将错误呈现给用户将允许他们看到它失败(并有一些想法为什么)。处理代码中的错误也可以让你的应用程序恢复。例如,如果您尝试读取粘贴的代码下面的文件(在写入磁盘后),但用户尝试将其写入到他们无法访问的网络共享中,则您的应用可能会崩溃。如果您知道写入失败,则可以相应地进行操作(也许会提示另一个保存位置)。

在这种情况下,虽然,我相信下面一行是你的问题:

NSString *fileName = [[NSString alloc] initWithFormat:@"%@.dat", selectedFile]; 

当你的应用是沙箱,用户需要给你权限,无论是特定文件或特定的一个目录通过打开/保存面板将它们带入您的沙箱。你正在做的是将用户给你的文件写入,并说“这很好,但我想保存一个不同的文件”,这违反了沙盒。你应该做的是在保存面板中设置扩展名。完整的固定的解决办法是:

NSSavePanel *save = [NSSavePanel savePanel]; 
[save setAllowedFileTypes:[NSArray arrayWithObject:@"dat"]]; 
[save setAllowsOtherFileTypes:NO]; 

NSInteger result = [save runModal]; 

if (result == NSOKButton) 
{ 
    NSString *selectedFile = [[save URL] path]; 
    NSString *arrayCompleto = @"bla bla bla"; 

    NSError *error = nil; 
    [arrayCompleto writeToFile:selectedFile 
        atomically:NO 
         encoding:NSUTF8StringEncoding 
          error:&error]; 
} 

if (error) { 
    // This is one way to handle the error, as an example 
    [NSApp presentError:error]; 
} 

如果在别的未来什么是错的,你可以在运行时检查error值。在调试时,在if (error)语句内设置一个断点,以检查error对象的值(在Xcode的调试器中执行po error)。这应该可以帮助你弄清楚什么是错的。

+0

非常感谢!它像一个魅力! 感谢您的帮助! Massy – Blue

+0

没问题。我也忘了提及,每当你处理文件I/O时处理错误是一个特别好的做法,因为即使你的代码是100%正确的,用户系统可能会有问题(权限不足等)。我补充说,答案。 – Dov

+0

您还可以设置提示的保存文件名,以便它不保存为'无标题'文档:[save setNameFieldStringValue:@“MySuggestedFilename”] –