Ouvrir le panneau apparaît puis disparaît immédiatement
-
19-09-2019 - |
Question
Je suis en utilisant ce code:
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel beginForDirectory:nil file:nil types:[NSImage imageFileTypes] modelessDelegate:self didEndSelector:NULL contextInfo:NULL];
Ceci est le seul code dans la méthode. Lorsque la méthode est appelée, le panneau ouvert apparaît à l'écran pendant une seconde puis disparait. Comment puis-je éviter cela?
Merci.
La solution
Étant donné que le panneau est non-blocage, l'exécution de code continue une fois que le panneau est ouvert. Le panneau ouvert est désallouée parce que vous ne tenez pas une référence à elle quelque part. -openPanel
est un constructeur de commodité et retourne un objet autoreleased qui disparaîtra quand la piscine actuelle autorelease est fait claquer ou (dans une application GC) lorsque le collecteur est prochaine course. Dans votre cas, cela est dès que votre méthode est terminée.
Si vous voulez que le panneau de rester, vous devez spécifiquement le conserver à l'aide -retain
, puis -release
ensuite dans le 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
}
Si vous utilisez la collecte des ordures, retain et release sont pas d'habitation, vous devez donc au lieu de stocker une référence forte à la NSOpenPanel
, comme le stockage dans une variable d'instance.