我在Cocoa应用程序中做了一个简单的文件打开面板。我启用了权利和应用沙盒。
但是在OS X 10.9上,当应用程序使用NSOpenPanel
打开一个对话框时,它会崩溃:
特定应用信息:
由于未捕获的异常“NSObjectNotAvailableException”而终止应用程序,原因是:'service com.apple.appkit.xpc.openAndSavePanelService无法代表由于{而无法初始化NSOpenPanelService的实例 “proxy-communications-error”=“错误域= NSCocoaErrorDomain代码= 4099 \”\ U041d \ U0435 \ U0443 \ U0434 \ U0430 \ U043b \ U043e \ U0441 \ U044c \ U0443 \ U0441 \ U0442 \ U0430 \ U043d \ U043e \ U0432 \ U0438 \ U0442 \ U044c \ U0441 \ U0432 \ U044f \ U0437 \ U044c \ U0441 \ U043f \ U0440 \ U043e \ U0433 \ U0440 \ U0430 \ U043c \ U043c \ U043e \ U0439- \ U043f \ U043e \ U043c \ U043e \ U0449 \ U043d \ U0438 \ U043a \ U043e \ U043c。\“(连接在此过程中无效。)UserInfo = 0x61000047dc00 {NSDebugDescription =此过程中的连接无效。}”; }“
来源:
self.panel = [NSOpenPanel openPanel];
panel.delegate = self;
panel.canChooseDirectories = YES;
panel.canChooseFiles = NO;
panel.canCreateDirectories = YES;
panel.allowsMultipleSelection = NO;
[self.panel beginSheetModalForWindow:contextWindow completionHandler:^(NSInteger returnCode) {
...
}];
有没有人见过这个?
答案 0 :(得分:26)
实际上,您必须明确允许对用户所选文件的读/写权限。在Xcode 5.1中,这是在功能 - 应用程序沙箱。
答案 1 :(得分:3)
我认为您需要在应用权利中激活“用户所选文件”!
尝试一下,在xcode 5 beta看起来像这样,在xcode 4应该在项目的常规页面上,你激活权利!
告诉我!
---------编辑
嗯,我认为你的问题在于如何调用面板。
首先,使用以下内容初始化面板:
NSOpenPanel * openDlg = [NSOpenPanel openPanel];
[openDlg setCanChooseFiles:NO];
[openDlg setAllowsMultipleSelection:NO];
[openDlg setCanChooseDirectories:YES];
[openDlg setCanCreateDirectories:YES];
最后,从:
更改对话框“call”[self.panel beginSheetModalForWindow:contextWindow completionHandler:^(NSInteger returnCode) { ... }];
为:
if ([openDlg runModal] == NSOKButton)
{ here you manage the user choice. }
现在应该可以使用了!
答案 2 :(得分:0)
我的OS X应用程序“Make a Face”在尝试调用简单文件打开面板时也存在问题。该应用程序不会崩溃,但“选择要打开的文件”窗口开始闪烁,对话框中的像素灯开始悸动,鼠标点击从20到40秒之间的任何地方都有延迟的影响。非常超现实。这只发生在小牛队10.9。
沙盒权利“com.apple.security.files.user-selected.read-write”已启用,就像之前所有应用上传一样。然而,在Mavericks的情况下,“悸动光文件开放式面板综合症”使用户在应用程序中打开用户选择的JPEG或PNG文件非常颠簸。
答案 3 :(得分:0)
在我的情况下,此错误的问题是在不是主线程的线程上调用[NSOpenPanel openPanel]
。将整个内容封装在
dispatch_async(dispatch_get_main_queue(), ^{
NSSavePanel *saveAsPanel = [[NSSavePanel alloc] init];
// ... bla bla...
});
解决了问题