Pregunta

Soy nuevo en NSOpenPanel / NSSavePanel / NSPanel. Estoy usando NSOpenPanel para elegir un directorio cuyos archivos de mi aplicación se repetirá una y hacer algo de procesamiento bastante tiempo.

Me puede llamar -close en el panel, pero eso no quiere devolver el foco a la ventana principal. He leído mucho acerca de "despedir" al panel - pero no he encontrado ningún método que "despedir" en lugar de "cerrar" un panel o una ventana

.

¿Es sólo que tengo que generará un subproceso de fondo (NSOperation)?

Esto es lo que mi -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];
        }
    }

Mientras que el NSOpenPanel no desaparece, mi NSProgressIndicator No anima y la ventana principal no está vivo hasta después -doLotsOfTimeConsumingWork:. Ultima

Actualizar Se limitó a NSOperationSample código, y es el aspecto de que es el camino a seguir.

¿Fue útil?

Solución

Dos notas:

En primer lugar, en Cocoa, el manejo de eventos y el dibujo pasa en el hilo principal. Por lo tanto, nunca es una buena idea para llamar de forma sincrónica largas métodos allí (que es la razón de su interfaz de usuario no responde).
Así que sí, usted debe entregar las tareas a computacionalmente costosos a un subproceso secundario de este método, al igual que de cualquier IBAction.

En segundo lugar, llamando [panel release] en ese método viola las reglas de la propiedad de objetos de cacao! Así que si usted estaría filtrando el panel sin esa llamada, usted debe arreglar eso en el método en el que va a crear el panel.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top