Вопрос

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

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

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

Спасибо.

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top