Obtener URL De beginSheetModalForWindow:
-
24-09-2019 - |
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.
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.