3 Stimmen

NSOpenPanel schließen, sobald Datei/Verzeichnis ausgewählt wurde

Ich bin neu bei NSOpenPanel/NSSavePanel/NSPanel. Ich verwende NSOpenPanel, um ein Verzeichnis auszuwählen, dessen Dateien meine App durchläuft und einige ziemlich zeitaufwändige Verarbeitungen vornimmt.

Ich kann -close auf dem Panel aufrufen, aber das gibt den Fokus nicht an das Hauptfenster zurück. Ich habe viel über das "Entlassen" des Panels gelesen - aber ich habe keine Methoden gefunden, die ein Panel oder ein Fenster eher "entlassen" als "schließen".

Ist es nur, dass ich einen Hintergrund-Thread (NSOperation) erstellen muss?

Dies ist das, was mein -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];
        }
    }

Während das NSOpenPanel verschwindet, wird mein NSProgressIndicator nicht animiert und das Hauptfenster erwacht nicht zum Leben, bis nach -doLotsOfTimeConsumingWork: abgeschlossen.

Update Ich habe mir gerade den Code von NSOperationSample angesehen, und es sieht so aus, als ob das der richtige Weg wäre.

1voto

danyowdee Punkte 4618

Zwei Anmerkungen:

Erstens findet in Cocoa die Ereignisbehandlung und das Zeichnen auf dem Hauptthread statt. Daher ist es nie eine gute Idee, lange Methoden dort synchron aufzurufen (was der Grund für Ihre nicht reagierende Benutzeroberfläche ist).
Also ja, Sie sollten rechenintensive Aufgaben von dieser Methode aus an einen sekundären Thread übergeben, wie von jeder IBAction .

Zweitens: Anrufen [panel release] in dieser Methode verstößt gegen die Cocoa-Regeln für Objektbesitz! Wenn Sie also das Panel ohne diesen Aufruf auslaufen lassen würden, sollten Sie das in der Methode beheben, in der Sie das Panel erstellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X