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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top