Открытая панель появляется и тут же исчезает

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

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

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

Спасибо.


person chrisgoyal    schedule 09.02.2010    source источник


Ответы (1)


Поскольку панель не блокируется, выполнение кода продолжается после открытия панели. Открытая панель освобождается, потому что вы где-то не держите ссылку на нее. -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, например, сохранить ее в переменной экземпляра.

person Rob Keniger    schedule 09.02.2010