Aprire il Pannello appare poi scompare subito
-
19-09-2019 - |
Domanda
Sto usando questo codice:
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel beginForDirectory:nil file:nil types:[NSImage imageFileTypes] modelessDelegate:self didEndSelector:NULL contextInfo:NULL];
Questo è l'unico codice nel metodo. Quando il metodo viene chiamato, viene visualizzato il pannello aperta sullo schermo per un secondo poi scompare. Come posso evitare questo?
Grazie.
Soluzione
Poiché il pannello è non bloccante, l'esecuzione di codice continua anche quando il pannello è aperto. Il pannello aperto viene deallocato perché non si è in possesso di un riferimento ad esso da qualche parte. -openPanel
è un costruttore di convenienza e restituisce un oggetto autoreleased che andrà via quando la piscina autorelease corrente è spuntato o (in un'applicazione GC) quando il collettore è prossima corsa. Nel tuo caso, questo è appena il vostro metodo è terminato.
Se si desidera che il pannello di restare, è necessario mantenere in particolare utilizzando -retain
, e poi successivamente -release
nel 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
}
Se stai usando Garbage Collection, trattenere e rilascio sono no-ops, quindi è necessario invece memorizzare un forte riferimento alla NSOpenPanel
, come ad esempio la memorizzazione in una variabile di istanza.