Domanda

Sono nuovo di NSOpenPanel / NSSavePanel / NSPanel. Sto usando NSOpenPanel di scegliere una directory i cui file la mia applicazione sarà iterare e fare un po 'di elaborazione piuttosto in termini di tempo.

posso chiamare -Chiudere sul pannello, ma questo non tornare attivo alla finestra principale. Ho letto un sacco di "respingendo" il pannello - ma non ho trovato tutti i metodi che "respingere", piuttosto che "chiudere" un pannello o una finestra

.

E 'solo che ho bisogno di generare un thread in background (NSOperation)?

Questo è ciò che il mio -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];
        }
    }

Mentre il NSOpenPanel non andare via, il mio NSProgressIndicator non anima e la finestra principale non si animano fino a dopo -doLotsOfTimeConsumingWork:. Completa

Aggiorna Appena guardato il codice NSOperationSample, ed è alla ricerca come questo è il modo di andare.

È stato utile?

Soluzione

Due note:

Innanzitutto, nel cacao, la manipolazione e disegno evento si verifica sul thread principale. Quindi non è mai una buona idea di chiamare in modo sincrono metodi là lunghe (che è il motivo per il vostro non risponde UI).
Quindi sì, si dovrebbe mano fuori compiti computazionalmente costosi ad un thread secondario da questo metodo, come da qualsiasi IBAction.

In secondo luogo, chiamando [panel release] in che il metodo viola le regole del cacao di proprietà oggetto! Quindi, se si sarebbe fuoriuscita pannello senza che la chiamata, si dovrebbe risolvere che nel metodo in cui si sta creando il pannello.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top