Открытая панель появляется, затем сразу исчезает - PullRequest
1 голос
/ 09 февраля 2010

Я использую этот код:

    NSOpenPanel *openPanel = [NSOpenPanel openPanel];
    [openPanel beginForDirectory:nil file:nil types:[NSImage imageFileTypes] modelessDelegate:self didEndSelector:NULL contextInfo:NULL];

Это единственный код в методе. Когда метод вызывается, открытая панель появляется на экране на секунду, а затем исчезает. Как мне это предотвратить?

Спасибо.

1 Ответ

2 голосов
/ 09 февраля 2010

Поскольку панель не блокируется, выполнение кода продолжается после открытия панели. Открытая панель освобождается, потому что вы нигде не держите ссылку на нее. -openPanel - это вспомогательный конструктор, который возвращает объект с автоматическим выпуском, который исчезнет, ​​когда будет активирован текущий пул автоматического выпуска, или (в приложении GC), когда сборщик будет запущен в следующий раз. В вашем случае это как только ваш метод завершится.

Если вы хотите, чтобы панель держалась, вы должны специально сохранить ее, используя -retain, а затем -release в 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
}

Если вы используете сборщик мусора, сохранение и освобождение не допускаются, поэтому вместо этого вы должны хранить строгую ссылку на NSOpenPanel, например, сохранять ее в переменной экземпляра.

...