2013-07-29 13 views
13

Sto facendo un semplice pannello di apertura file nella mia app Cocoa. Attivo le autorizzazioni e il sandboxing delle app. Ma su OS X 10.9, quando l'applicazione dovrebbe aprire una finestra di dialogo utilizzando NSOpenPanel, si blocca con:L'applicazione in modalità sandbox e NSOpenPanel causa arresti anomali

Application Specific Information:
terminazione app a causa di eccezione non identificata 'NSObjectNotAvailableException', la ragione: 'com.apple servizio .appkit.xpc.openAndSavePanelService non è riuscito a avviare un'istanza di NSOpenPanelService per conto di causa di { "proxy-communications-error" = "Dominio errore = NSCocoaErrorDomain Code = 4099 \" \ U041d \ U0435 \ U0443 \ U0434 \ U0430 \ U043b \ U043e \ U0441 \ U044c \ U0443 \ U0441 \ U0442 \ U0430 \ U043d \ U043e \ U0432 \ U0438 \ U0442 \ U044c \ U0441 \ U0432 \ U044f \ U0444 \ U044c \ U0441 \ U043f \ U0440 \ U043e \ U0433 \ U0440 \ U0430 \ U043c \ U043c \ U043e \ U0439- \ U043f \ U043e \ U043c \ U043e \ U0449 \ U043d \ U0438 \ U043a \ U043e \ U043c. \ "(La connessione è stata invalidata da questo processo.) UserInfo = 0x61000047dc00 {NSDebugDescription = La connessione è stata invalidata da questo processo.}"; }'

Fonte:

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

qualcuno ha visto questo prima?

+0

Si prega di aggiungere il codice che crea questo errore – Beryllium

+0

Hai mai capire questo? Sto avendo lo stesso identico problema. – robertmiles3

risposta

3

Penso che sia necessario attivare "File selezionato dall'utente" nei diritti delle app!

Provalo, in xcode 5 beta sembra così, in xcode 4 dovrebbe essere nella pagina generale del tuo progetto, dove attivi le autorizzazioni!

fammi sapere!

--------- Modifica

Beh, penso che il problema è nel modo in cui si chiama il pannello.

In primo luogo, inizializzare il pannello con:

NSOpenPanel * openDlg = [NSOpenPanel openPanel]; 

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

infine, cambiare la finestra di dialogo "chiamata" da:

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

a:

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

Dovrebbe funzionare ora!

+0

Specifico ** "com.apple.security.files.user-selected.read-write" ** diritto. Si blocca solo su OS X 10.9. – VKorsun

+0

Ho modificato la mia risposta, dai un'occhiata! – Benz

0

La mia app per OS X "Make a Face" ha anche problemi quando si tenta di chiamare un semplice pannello aperto. L'app non si arresta, ma la finestra "seleziona il file da aprire" inizia a luccicare, la luce pixel nella finestra di dialogo inizia a pulsare ei clic del mouse hanno un impatto ritardato da qualsiasi punto tra 20 e 40 secondi. Molto surreale. Questo succede solo in Mavericks 10.9.

L'autorizzazione Sandbox "com.apple.security.files.user-selected.read-write" è abilitata, come è stato per tutti i precedenti caricamenti dell'app. Tuttavia, con Mavericks, la "sindrome del pannello aperto con file di luci lampeggianti" rende l'apertura di un file JPEG o PNG selezionato dall'utente all'interno dell'app un passaggio molto irregolare.

+0

Hai mai trovato una soluzione a questo? –

+0

Anche io sto vedendo questo. Sono su Mavericks e non ho potuto testarlo su nient'altro. Ma, la prima volta che apro un NSOpenPanel, ci vuole * per sempre * ... come hai detto 20-40 secondi. La seconda volta che lo chiamo, sembra che stia bene. Facendomi impazzire! – robertmiles3

26

In effetti, è necessario consentire specificamente autorizzazioni di lettura/scrittura sui file selezionati dall'utente. In Xcode 5.1 questo è in Funzionalità - App Sandbox.

enter image description here

+0

Incredibilmente utile! Grazie Jay. – ixany

+0

Questa è la risposta giusta per il mio caso. Grazie! – Jim75

0

Nel mio caso il problema di questo errore stava chiamando [NSOpenPanel openPanel] su un thread che non era quella principale. Incapsulare il tutto all'interno di un

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

risolto il problema

Problemi correlati