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.

¿Fue útil?

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.

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