2013-07-29 13 views
13

Ich mache eine einfache Datei öffnen Panel in meiner Cocoa App. Ich aktiviere Berechtigungen und App Sandboxing. Aber auf OS X 10.9, wenn die Anwendung ein Dialog NSOpenPanel mit öffnen sollte, stürzt mit:Sandboxed App & NSOpenPanel verursacht Abstürze

Anwendungsspezifische Informationen:
App beenden aufgrund nicht abgefangene Ausnahme 'NSObjectNotAvailableException' Grund: ‚Service com.apple .appkit.xpc.openAndSavePanelService konnte eine Instanz von NSOpenPanelService im Auftrag von { "proxy-communications-error" = "Fehlerdomäne = NSCoaErrorDomain-Code = 4099 \" \ U041d \ U0435 \ U0443 \ U0434 \ U0430 \ U043b nicht initiieren \ U043e \ U0441 \ U044c \ U0443 \ U0441 \ U0442 \ U0438 \ U0442 \ U0437 \ U0441 \ U0441 \ U043f \ U0437 \ U044c \ U0433 \ U0440 \ U0430 \ U043c \ U043c \ U043e \ U0439 - \ U043 \ U043e \ U043c \ U043e \ U0449 \ U043d \ U0438 \ U043a \ U043e \ U043c. "(Die Verbindung wurde von diesem Prozess ungültig gemacht.) UserInfo = 0x61000047dc00 {NSDebugDescription = Die Verbindung wurde von diesem Prozess ungültig gemacht.}"; }‘

Quelle:

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) { 
     ... 
    }]; 

Hat jemand schon einmal gesehen?

+0

ausgewertete Bitte fügen Sie den Code, der diesen Fehler erzeugt – Beryllium

+0

Haben Sie das jemals herausgefunden? Ich habe genau das gleiche Problem. – robertmiles3

Antwort

3

Ich denke, dass Sie "User selected file" in Ihren App-Berechtigungen aktivieren müssen!

Probieren Sie es aus, in xcode 5 Beta sieht so aus, in xcode 4 sollte auf der allgemeinen Seite Ihres Projekts sein, wo Sie Berechtigungen aktivieren!

lass es mich wissen!

--------- bearbeiten

Nun, ich denke, Ihr Problem in ist, wie Sie das Panel aufrufen.

Zuerst initialisieren das Panel mit:

[self.panel beginSheetModalForWindow:contextWindow completionHandler:^(NSInteger returnCode) { ... }]; 

zu:

NSOpenPanel * openDlg = [NSOpenPanel openPanel]; 

[openDlg setCanChooseFiles:NO]; 
[openDlg setAllowsMultipleSelection:NO]; 
[openDlg setCanChooseDirectories:YES]; 
[openDlg setCanCreateDirectories:YES]; 

schließlich den Dialog von ändern "call"

if ([openDlg runModal] == NSOKButton) 
{ here you manage the user choice. } 

Es sollte jetzt arbeiten!

+0

Ich spezifiziere ** "com.apple.security.files.user-selected.read-write" ** Berechtigung. Es stürzt nur unter OS X 10.9 ab. – VKorsun

+0

Ich habe meine Antwort bearbeitet, schau es dir an, Kumpel! – Benz

0

Meine OS X-App "Make a Face" hat auch Probleme, wenn Sie versuchen, eine einfache Datei öffnen zu öffnen. Die App stürzt nicht ab, aber das Fenster zum Auswählen der zu öffnenden Datei beginnt zu schimmern, das Pixellicht in der Dialogbox beginnt zu pochen und Mausklicks haben einen verzögerten Einfluss von irgendwo zwischen 20 und 40 Sekunden. Sehr surreal. Dies geschieht nur in Mavericks 10.9.

Sandbox-Berechtigung "com.apple.security.files.user-selected.read-write" ist aktiviert, wie es für alle vorherigen Uploads der App war. Unter "Mavericks" macht das "pochende Licht-Datei-Öffnen-Panel-Syndrom" das Öffnen einer vom Benutzer ausgewählten JPEG- oder PNG-Datei innerhalb der App jedoch zu einer sehr holprigen Fahrt.

+0

Haben Sie jemals eine Lösung gefunden? –

+0

Ich sehe das auch. Ich bin auf Mavericks und konnte es an nichts anderem testen. Aber wenn ich zum ersten Mal ein NSOpenPanel öffne, dauert es * für immer * ... wie du gesagt hast 20-40 Sekunden. Das zweite Mal, wenn ich es nenne, scheint es in Ordnung zu sein. Macht mich verrückt! – robertmiles3

26

In der Tat müssen Sie Lese-/Schreibberechtigungen für Benutzer ausgewählte Dateien ausdrücklich zulassen. In Xcode 5.1 ist dies unter Capabilities - App Sandbox.

enter image description here

+0

Unglaublich hilfreich! Danke Jay. – ixany

+0

Das ist die richtige Antwort für meinen Fall. Vielen Dank! – Jim75

0

In meinem Fall ist das Problem für diesen Fehler ruft [NSOpenPanel openPanel] auf einem Faden, der nicht die Haupt war. Einkapseln das Ganze in einem

dispatch_async(dispatch_get_main_queue(), ^{ 
    NSSavePanel *saveAsPanel = [[NSSavePanel alloc] init]; 
    // ... bla bla... 
}); 

das Problem

Verwandte Themen