沙盒时NSSavePanel无法正常工作? - OSX•目标C.

时间:2015-05-05 19:04:38

标签: objective-c macos sandbox appstore-sandbox nssavepanel

我的应用中有以下保存面板。我最近尝试过沙箱,但不幸的是,当沙盒保存似乎不起作用时。

我知道beginSheetForDirectory已被折旧,所以可能这就是为什么它不起作用?如何使用沙盒来实现这一点?

- (IBAction)saveButtonPressed:(id)sender
{
    NSSavePanel *sp = [NSSavePanel savePanel];
    [sp setRequiredFileType:@"jpg"];

    [sp beginSheetForDirectory:[NSString stringWithFormat:@"%@/Pictures", NSHomeDirectory()]
                      file:@"output.jpg" 
            modalForWindow:window
             modalDelegate:self 
            didEndSelector:@selector(didEndSaveSheet:returnCode:conextInfo:) 
               contextInfo:nil];
}



-(void)didEndSaveSheet:(NSSavePanel *)savePanel
        returnCode:(int)returnCode conextInfo:(void *)contextInfo
{
    if (returnCode == NSOKButton) 
    {
     self.baseFilename = [[savePanel filename] stringByDeletingPathExtension];
     tileHeight = [heightTextField intValue];
     tileWidth = [widthTextField intValue];

     [self performSelector:@selector(delayPresentSheet) withObject:nil afterDelay:0.1];
    }
} 

1 个答案:

答案 0 :(得分:1)

当您使用沙盒时,您不能只访问任何文件。您的应用需要获得访问该文件的权限。因此,任何为您提供路径的API都无法运行。沙箱不可能确定文件名是否来自保存面板。

有新的API返回一个URL,这些URL以某种方式拥有访问内置文件的权限。您需要使用该URL;如果您想稍后使用它(退出并重新启动应用程序后),您必须将URL与任务一起存储。

这就是它的工作原理,您需要查阅Apple的文档以获取详细信息。问题不在于旧API已被弃用,问题在于它没有为您提供包含沙箱权限的特殊URL。