沙盒应用中的NSOpenPanel忽略了提供的目录URL

7

我正在开发沙盒化的OS X应用程序(OS X 10.10.5,Xcode 6.4)。 在执行过程中,我打开了NSOpenPanel对象。 然后我运行下面的代码片段:

NSString* s=[@"~" stringByExpandingTildeInPath]; 
NSOpenPanel* panel = [NSOpenPanel openPanel];
[panel setCanChooseDirectories:YES];
[panel setCanChooseFiles:NO];
NSURL* url=[NSURL fileURLWithPath:s];
if(url){
    [panel setDirectoryURL:url];
}
[panel setAllowsMultipleSelection:YES];
[panel beginSheetModalForWindow:[self.outlineView window]completionHandler:^(NSInteger result) {}

我希望面板可以打开在目录/Users/xxx/Library/Containers/com.123456.App/下。

而不是打开在目录/Users/xxx下。

应用实际上是构建和部署到目录/Users/xxx/Library/Containers/com.123456.App/Data/下的。

当我调试时,我观察到此时:

if(url){
    [panel setDirectoryURL:url];
}

url包含正确的值:file:///Users/xxx/Library/Containers/com.123456.App/Data/

有什么想法吗?

1个回答

1

你想在应用程序容器中使用 NSOpenPanel 的原因是什么?容器用于应用程序的内部数据/支持文件(用户通常不需要访问)。NSOpenPanel/NSSavePanel 用于用户从其自己的文档中选择文件/目录,这些文件/目录不会位于容器中。

此外,考虑使用 NSFileManager URLsForDirectory:inDomains: 获取所需路径的 NSURL。


是的,我有一个理由,并且根据苹果的指南,如果我想要浏览目录,我必须使用NSOpenPanel。 - BorisV
没错,但使用NSOpenPanel浏览您的应用程序容器是没有意义的。不应该在容器中存储任何用户数据,只有用户不应直接访问的应用程序内部文件。无论如何,如果您使用NSURL* url=[NSURL fileURLWithPath:NSHomeDirectory()];,是否有任何区别? - Brendan Shanks
3
@Boris - 你只需要使用 NSOpenPanel 来获取用户授予你的应用程序无权访问的文件的访问权限。容器中的文件可以直接访问,您可以使用通常的API找到目录的内容。 - CRD
我的情况是,当应用程序首次运行时,它会创建一些示例用户文件。理想情况下,它们应该在“文档/MyApp”子文件夹中,但沙盒会将它们放入等效的沙盒位置。因此,我希望用户能够使用NSOpenPanel浏览/打开它们。但是根据原始帖子,NSOpenPanel忽略了沙盒路径,实际上只向用户呈现文档文件夹。那么,符合Apple指南和沙盒限制的设置这种情况的适当方式是什么? - gpdawson
我遇到了同样的问题。我有一个快速保存按钮,可以将文件保存到文档目录(它们被保存到沙盒目录),然后我希望用户能够使用NSOpenPanel打开保存的文件,但是那会打开用户实际的文档目录!我不想让用户必须打开NSSavePanel才能保存文档。但是,我不能在没有NSSavePanel的情况下保存到用户的文档目录。很烦人。我还没有找到解决这个问题的方法。 - Sean Mayes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接