Question

Je suis nouveau à NSOpenPanel / NSSavePanel / NSPanel. J'utilise NSOpenPanel de choisir un répertoire dont les fichiers mon application va parcourir et faire un traitement assez de temps.

Je peux appeler -près sur le panneau, mais qui ne renvoie pas le focus à la fenêtre principale. J'ai lu beaucoup de choses sur « rejeter » le groupe spécial - mais je ne l'ai pas trouvé de méthodes « rejeter » plutôt que « fermer » un panneau ou une fenêtre

.

Est-il juste que je dois frayer un fil d'arrière-plan (NSOperation)?

est ce que mon -chooseDidEnd: returnCode: contextInfo:

-(void) chooseDidEnd:(NSOpenPanel *)panel returnCode:(int)returnCode contextInfo:(void *)contextInfo
    {
    [panel orderOut:self];
    [panel release];

    if (returnCode == NSFileHandlingPanelOKButton)
        {
        [progressIndicator startAnimation:self];
        [self doLotsOfTimeConsumingWork:[[panel URL] path]];
        [progressIndicator stopAnimation:self];
        }
    }

Alors que le NSOpenPanel ne va loin, mon NSProgressIndicator ne Animer et la fenêtre principale ne vient pas en vie jusqu'à ce que après -doLotsOfTimeConsumingWork. Finalise

Mise à jour Juste regardé le code NSOperationSample, et il est à la recherche comme ça est le chemin à parcourir.

Était-ce utile?

La solution

Deux notes:

D'abord, à Cocoa, le traitement et le dessin événement se produit sur le thread principal. Il est donc jamais une bonne idée d'appeler des méthodes longues synchroniquement là-bas (ce qui est la raison de votre interface utilisateur ne répond pas).
Alors oui, vous devez remettre de tâches coûteuses à informatiquement un fil secondaire à partir de cette méthode, comme de toute IBAction.

En second lieu, appelant [panel release] dans cette méthode constitue une violation des règles de propriété objet de cacao! Donc, si vous seriez le panneau sans une fuite de cet appel, vous devez résoudre ce problème dans la méthode où vous créez le panneau.

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