Frage

Ich bin neu in NSOpenPanel / NSSavePanel / NSPanel. Ich verwende NSOpenPanel ein Verzeichnis zu wählen, deren Dateien meine App laufen wird und tun Verarbeitung einige ziemlich zeitaufwendig ist.

Ich kann auf dem Panel rufen -close, aber das nicht wieder den Fokus auf das Hauptfenster. Ich habe eine Menge über „Entlassung“ die Tafel lesen - aber ich gefunden habe keine Methoden, die „entlassen“ und nicht als „close“ eine Platte oder ein Fenster

.

Ist es nur, dass ich einen Hintergrund-Thread (NSOperation) zum Laichen?

Dies ist, was mein -chooseDidEnd: return: 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 die NSOpenPanel gehen weg, mein NSProgressIndicator nicht belebter und das Hauptfenster kommt nicht am Leben, bis nach -doLotsOfTimeConsumingWork. Abgeschlossen ist

Aktualisieren Nur sah NSOperationSample Code, und es ist wie die Suche ist der Weg zu gehen.

War es hilfreich?

Lösung

Zwei Anmerkungen:

Zuerst in Cocoa, das Event-Handling und Zeichnung geschehen auf dem Haupt-Thread. Daher ist es nie eine gute Idee, um synchron langwierige Verfahren dort anrufen (das ist der Grund für Ihre nicht mehr reagiert UI ist).
Also ja, sollten Sie rechenintensive Aufgaben zu einem sekundären Thread von dieser Methode der Hand aus, wie von jedem IBAction.

Zweitens ruft [panel release] in diesem Verfahren gegen Cocoa Regeln des Objektbesitz! Also, wenn Sie ohne diesen Anruf das Panel undicht sein würden, sollten Sie, dass bei dem Verfahren festlegen, wenn Sie das Panel sind zu schaffen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top