我在保存字符串文件时遇到问题NSSavePanel
将应用程序沙箱到 Mac App Store 后。我设置com.apple.security.files.user-selected.read-write
to 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];
当您的应用程序被沙盒化时,用户需要向您授予以下任一权限:特定文件 or a 具体目录通过打开/保存面板将它们带入您的沙箱。您所做的就是获取用户授予您写入权限的文件并说“这很好,但我想保存另一个文件”,这违反了沙箱。您应该做的是在保存面板中设置扩展名。完整的固定解决方案是:
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 的调试器中)。这应该可以帮助您找出问题所在。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)