Domanda

sto usando un OpenPanel per ottenere un URL percorso del file. Questo funziona:

[oPanel beginSheetModalForWindow:theWindow completionHandler:^(NSInteger returnCode)
{
 NSURL *pathToFile = nil;

 if (returnCode == NSOKButton)
     pathToFile = [[oPanel URLs] objectAtIndex:0];
}];

Questo non lo fa, con un conseguente 'assegnazione di sola lettura variabile' errore:

NSURL *pathToFile = nil;
[oPanel beginSheetModalForWindow:theWindow completionHandler:^(NSInteger returnCode)
{
 if (returnCode == NSOKButton)
     pathToFile = [[oPanel URLs] objectAtIndex:0];
}];
return pathToFile;

In generale, ogni tentativo di estrarre pathtofile dal contesto della Opañel ha fallito. Questo non è un grande affare per le piccole situazioni, ma come il mio codice cresce, sono costretto a roba tutto - parsing XML, i dati di base, ecc - all'interno di una regione inappropriato. Che cosa posso fare per estrarre pathtofile?

Grazie.

È stato utile?

Soluzione

  

Questo non lo fa, con un conseguente 'assegnazione di sola lettura variabile' errore:

NSURL *pathToFile = nil;
[oPanel beginSheetModalForWindow:theWindow completionHandler:^(NSInteger returnCode)
{
 if (returnCode == NSOKButton)
     pathToFile = [[oPanel URLs] objectAtIndex:0];
}];
return pathToFile;

Sì, perché si sta cercando di assegnare alla copia della variabile pathToFile che viene fatta quando si crea il blocco. Non stai assegnando alla variabile pathToFile originale che hai dichiarato di fuori del blocco.

Si potrebbe usare la __block parola chiave per consentire al blocco di assegnare a questa variabile, ma non credo che questo aiuterà a causa beginSheetModalForWindow:completionHandler: non blocca. (La documentazione non menziona questo, ma non c'è alcun motivo per il metodo di blocco, e si può verificare con la registrazione che non è così.) I rendimenti messaggio immediatamente, mentre il pannello è ancora in esecuzione.

Quindi, si sta cercando di avere il blocco di completamento-handler assegnare a una variabile locale, ma il metodo in cui avete dichiarato la variabile locale sarà probabilmente sono tornati vicino alle piste da blocchi di tempo, in modo che non sarà in grado di lavoro con il valore che il blocco sinistra lascerà nella variabile.

Qualunque cosa fate con pathToFile dovrebbe essere sia nel blocco stesso, o in un metodo (prendendo un argomento NSURL *) che il blocco può chiamare.

Altri suggerimenti

si può anche runModal dopo aver iniziato il foglio solo bisogno di assicurarsi che si finisce il foglio in seguito. In questo modo non si deve piegare alla volontà di Apple, non è deprecato e dovrebbe ancora funzionare perfettamente.

NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel beginSheetModalForWindow:window completionHandler:nil];
NSInteger result = [openPanel runModal];
NSURL *url = nil;
if (result == NSFileHandlingPanelOKButton) 
{
    url = [openPanel URL];
}
[NSApp endSheet:openPanel];

Mi sembra un po 'come la magia nera di codifica ma funziona.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top