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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top