我在保存一个字符串文件有问题NSSavePanel
沙箱为Mac App Store中的后。 我设置com.apple.security.files.user-selected.read-write
到YES
和NSOpenPanel
工作,因为它应该。
当我尝试保存新文件,不过,似乎一切正常,但随后没有保存的文件,它应该是....
这是我使用的保存文件的代码:
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];
}
首先,在-[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
对象的值(做一个po error
在Xcode的调试器)。 这应该帮助你找出什么是错的。