Pregunta

Estoy usando un OpenPanel para obtener una URL ruta del archivo. Estos trabajos:

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

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

Esto no significa, que resulta en una 'asignación de sólo lectura variable' error:

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

En general, cualquier intento de pathtofile extracto del contexto de Opañel ha fallado. Esto no es una cosa muy importante para situaciones pequeños, pero a medida que crece mi código, yo estoy obligado a poner todo - análisis de XML, datos básicos, etc - dentro de una región apropiada. ¿Qué puedo hacer yo para extraer pathtofile?

Gracias.

¿Fue útil?

Solución

  

Esto no significa, que resulta en una 'asignación de sólo lectura variable' error:

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

Sí, porque usted está tratando de asignar a la copia de la variable pathToFile que se enviaran cuando se crea el bloque. No estamos asignando a la variable pathToFile original que declara fuera del bloque.

la __block palabra clave dejar que el bloque de asignar a esta variable, pero no creo que esto ayudará porque beginSheetModalForWindow:completionHandler: no bloquea. (La documentación no menciona esto, pero no hay razón para que el método de bloque, y se puede verificar con el registro que no es así.) Los rendimientos de mensajes de inmediato, mientras que el panel sigue funcionando.

Por lo tanto, usted está tratando de tener su bloque finalización-manejador asignar a una variable local, pero su método en el que se declaró la variable local probablemente habrá devuelto por las carreras de bloques de tiempo, por lo que no será capaz de el trabajo con el valor que el bloque izquierdo dejará en la variable.

Haga lo que haga con pathToFile debe ser ya sea en el propio bloque, o en un método (teniendo un argumento NSURL *) que el bloque pueda llamar.

Otros consejos

También puede runModal después de que comience la hoja sólo tiene que asegurarse de que termina la hoja posterior. De esta manera usted no tiene que doblar a la voluntad de manzana, no es obsoleto y debería seguir funcionando perfectamente.

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];

Parece un poco como magia negro de codificación, pero funciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top