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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top