2010-02-09 4 views
1

J'utilise ce code:Ouvrir le panneau apparaît puis disparaît immédiatement

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

C'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 disparaît. Comment puis-je empêcher cela?

Merci.

Répondre

2

Étant donné que le panneau est non-bloquant, l'exécution du code se poursuit une fois le panneau ouvert. Le panneau ouvert est désaffecté parce que vous ne détenez pas de référence quelque part. -openPanel est un constructeur de commodité et renvoie un objet autoreleased qui disparaîtra lorsque le pool autorelease actuel est sauté ou (dans une application GC) lorsque le collecteur est la prochaine exécution. Dans votre cas, c'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 par la suite -release 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 ne sont -ops, vous devez donc stocker une référence forte au NSOpenPanel, par exemple en la stockant dans une variable d'instance.

Questions connexes