Abrir panel aparece a continuación, desaparece inmediatamente
-
19-09-2019 - |
Pregunta
Estoy utilizando este código:
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel beginForDirectory:nil file:nil types:[NSImage imageFileTypes] modelessDelegate:self didEndSelector:NULL contextInfo:NULL];
Este es el único código en el método. Cuando se llama al método, el panel abierto aparece en la pantalla durante un segundo y luego desaparece. ¿Cómo puedo evitar esto?
Gracias.
Solución
Dado que el panel es no bloqueante, la ejecución de código continua una vez el panel se ha abierto. El panel abierto se cancela la asignación porque no se está llevando a cabo una referencia a él en alguna parte. -openPanel
es un constructor de conveniencia y devuelve un objeto autoreleased que desaparece cuando la piscina autorelease actual se extrae o (en una aplicación GC) cuando el colector está próxima ejecución. En su caso, se trata tan pronto como su método ha terminado.
Si desea que el panel de quedarse, debe conservar específicamente utilizando -retain
, y luego posteriormente -release
en el didEndSelector:
- (void)showPanel
{
NSOpenPanel *openPanel = [[NSOpenPanel openPanel] retain]; //note the retain
[openPanel beginForDirectory:nil
file:nil
types:[NSImage imageFileTypes]
modelessDelegate:self
didEndSelector:@selector(myOpenPanelDidEnd:returnCode:contextInfo:)
contextInfo:NULL];
}
- (void)myOpenPanelDidEnd:(NSOpenPanel *)panel returnCode:(int)returnCode contextInfo:(void*)contextInfo
{
NSArray* fileNames = [panel filenames];
[panel release];
//do something with fileNames
}
Si está utilizando recolección de basura, retener y liberar hay-ops, por lo que en su lugar debe almacenar una fuerte referencia a la NSOpenPanel
, como almacenarlo en una variable de instancia.