2011-01-12 12 views
6

Estoy tratando de usar un NSProgressIndicator (indeterminado) dentro de un menú de la barra de estado. Estoy usando un objeto NSView como vista para el elemento de menú, y luego subvisualizo el indicador de progreso para mostrarlo. Pero cada vez que trato de llamar a la animación de inicio: para el progreso, no pasa nada. Cuando intento hacer lo mismo en una NSWindow normal, funciona perfectamente, pero no cuando está dentro de un elemento de menú.Usando NSProgressIndicator dentro de un NSMenuItem

Soy nuevo en cocoa y Objective-c, así que podría haber pasado por alto algo "obvio", pero he buscado bastante para una solución, pero sin éxito. Descubrí que los elementos del menú no se pueden actualizar mientras se muestran y que en su lugar debe usar una ventana sin bordes. Pero no he podido confirmar esto en ninguna documentación.

Edit:

Ok, casi funciona ahora. Al usar setUsesThreadedAnimation: y desde el menú de MenuDelegateWillOpen y creando un nuevo hilo. Este hilo se ejecuta un método local:

-(void) doWork(NSProgressIndicator*) p{ 
    [p startAnimation:self]; 
} 

Esto iniciará el ProgressIndicator de forma aleatoria al abrir el menú (?). Si llamo al startAnimation: directamente sin pasar por doWork: (sigue usando un nuevo hilo), nunca funciona. ¿No hace setUsesThreadedAnimation: que la barra de progreso cree su propio hilo para la animación?

Respuesta

16

lo resolvió mediante el uso de:

[progressIndicator performSelector:@selector(startAnimation:) 
          withObject:self 
          afterDelay:0.0 
           inModes:[NSArray 
         arrayWithObject:NSEventTrackingRunLoopMode]]; 

Dentro de la menuWillOpen :, el problema parece haber sido llamar startAnimation: antes del progressbar se terminó el dibujo en sí.

+0

¡Muchas gracias por ese consejo, realmente ayuda! – Yojik

+0

¡Loco cuánto tiempo he estado buscando para hacer que esto funcione, muchas gracias! – Jasper

+0

Gracias amigo! Gracias amigo! Gracias amigo! –

0

¿Le ha dicho que use animación enhebrada a través de -setUsesThreadedAnimation :?

+0

Sí, parece que no ayuda. – Henrik

1

¿Cómo hace referencia al NSProgressIndicator que está en la vista (y el que está en la ventana, para el caso)? Por ejemplo, ¿tiene una clase de controlador que tiene IBOutlet conectado a los indicadores de progreso? Si está utilizando un IBOutlet, ¿está seguro de que está conectado correctamente en el archivo de punta?

Además, ¿dónde y cuándo llama al startAnimation:? (Necesitamos ver algún código).

Una cosa que a veces puede pasar es que olvide conectar un IBOutlet en la punta. Luego, cuando intenta decirle al objeto que haga algo en el código en tiempo de ejecución, IBOutlet es nil, y entonces lo que usted piensa que es un mensaje enviado a su objeto es, de hecho, un mensaje que se envía al nil. En otras palabras, simplemente se ignora y efectivamente parece que no está funcionando.

Siempre que tenga una referencia (potencialmente) válida al objeto UI, el otro problema común que verá es cuando un desarrollador intenta enviar un mensaje al objeto "demasiado pronto". En general, los métodos init son demasiado tempranos en la duración del objeto del controlador para poder enviar mensajes a los objetos de la interfaz del usuario; esos IBOutlet aún son nil. Cuando se llame al -awakeFromNib, el IBOutlet debe ser válido (siempre que los haya enlazado en IB) y luego puede enviar el mensaje al objeto UI.

+0

Son buenos puntos, eso explica por qué a veces tenía valores nulos cuando trataba de llegar a los componentes de salida (llamándolos demasiado pronto). Ahora parece que lo reduzco a un problema de dibujo.Lo he animado cuando el elemento de menú que contiene la vista está resaltado (en drawRect :) de mi vista, y luego lo detengo cuando ya no está resaltado. Pero si trato de animarlo fuera de la cláusula if que comprueba si el elemento está resaltado, no pasa nada (aún dentro de drawRect :). – Henrik

+0

He logrado que funcione un poco más, parece que tuve que enviar stopAnimation: alguna vez antes para hacer que startAnimation: work. Pero quiero animar (o no) cuando se muestra el menú. Actualmente tengo que pasar el ratón por encima de la vista para que comience, cuando se muestra el menú, solo muestra la barra de progreso sin animar, aunque debería estar oculta cuando no (setDisplayWhenStopped: NO). Continuará en el próximo comentario ... – Henrik

+0

Y todavía no puedo hacer que funcione cuando lo llamo desde fuera de mi objeto de visualización, p. navegando a través de subvistas de NSMenu en su clase de controlador. Parece que tiene que haber algún tipo de evento cuando se muestra el menú para que la animación funcione. – Henrik

Cuestiones relacionadas