O painel aberto aparece então desaparece imediatamente
-
19-09-2019 - |
Pergunta
Estou usando este código:
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel beginForDirectory:nil file:nil types:[NSImage imageFileTypes] modelessDelegate:self didEndSelector:NULL contextInfo:NULL];
Este é o único código no método. Quando o método é chamado, o painel aberto aparece na tela por um segundo e desaparece. Como faço para evitar isso?
Obrigado.
Solução
Como o painel não está bloqueando, a execução do código continua assim que o painel é aberto. O painel aberto está sendo desalocado porque você não está mantendo uma referência a ele em algum lugar. -openPanel
é um construtor de conveniência e retorna um objeto autorizado que desaparecerá quando o pool de autorelease atual for estourado ou (em um aplicativo GC) quando o coletor for executado em seguida. No seu caso, isso é assim que seu método terminar.
Se você deseja que o painel permaneça, você deve retê -lo especificamente usando -retain
, e então posteriormente -release
no 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 você estiver usando a coleta de lixo, retenha e libere não são ninguém, então você deve armazenar uma forte referência ao NSOpenPanel
, como armazená -lo em uma variável de instância.