2011-01-14 8 views
2

Ich bin neu in NSOpenPanel/NSSavePanel/NSPanel. Ich benutze NSOpenPanel, um ein Verzeichnis zu wählen, dessen Dateien von meiner App durchlaufen werden und eine ziemlich zeitaufwendige Verarbeitung machen.Schließen Sie NSOpenPanel, sobald Datei/Verzeichnis ausgewählt wurde

Ich kann -close auf dem Panel aufrufen, aber das gibt den Fokus nicht auf das Hauptfenster zurück. Ich habe viel darüber gelesen, wie man das Panel "ablehnt" - aber ich habe keine Methoden gefunden, die ein Panel oder ein Fenster "verwerfen" und nicht "schließen".

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

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 weggeht nicht, mein NSProgressIndicator animiert nicht und das Hauptfenster bis nach -doLotsOfTimeConsumingWork am Leben nicht kommen: schließt ab.

aktualisiert Gerade bei NSOperationSample Code aussieht, und es ist die Art und Weise, wie das ist, suchen zu gehen.

Antwort

1

Zwei Anmerkungen:

Zuerst in Cocoa, Umgang mit dem Ereignisse und Zeichnung geschieht auf dem Haupt-Thread. Daher ist es nie eine gute Idee, langwierige Methoden synchron aufzurufen (was der Grund für Ihre nicht reagierende Benutzeroberfläche ist).
Also ja, Sie sollten rechenintensive Aufgaben von dieser Methode an einen sekundären Thread übergeben, wie von jedem IBAction.

Zweitens, ruft [panel release] in dieser Methode gegen Cocoa-Regeln des Objektbesitzes! Wenn Sie also das Panel ohne diesen Aufruf verlassen würden, sollten Sie dies in der Methode korrigieren, mit der Sie das Panel erstellen.

+0

danke. fwiw, -chooseDidEnd: returnCode: contextInfo: wurde fast wortwörtlich aus Apples NSOperationSample-Beispielcode übernommen. Würden Sie erklären, warum diese Version gegen Eigentumsregeln verstößt? Vielen Dank. – westsider

+0

"wurde fast wortwörtlich aus Apples NSOperationSample-Beispielcode übernommen" <- Ooh, das ist nicht so nett! Re-Besitz: Sie haben das Objekt als Argument übergeben, also besitzen Sie es nicht - das ist alles. Selbst wenn Sie das Panel über alloc/init in der Methode erstellt haben, in der Sie die modale Sitzung starten, wäre "didEnd ..." nicht der richtige Ort für diese Version - die andere Methode sollte nicht undicht sein, so dass das Panel automatisch freigegeben werden musste (oder erstellen Sie es einfach über '[NSOpenPanel openPanel]', das automatisch wieder freigegeben wird). – danyowdee

Verwandte Themen