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