2010-06-16 18 views
10

En IB puedo establecer el identificador de un UIBarButtonItem para 'reproducir', que agrega una imagen de un botón de reproducción (triángulo que apunta hacia la derecha).¿Cambiar (no init) un identificador UIBarButtonItem programáticamente?

¿Hay alguna manera de cambiar esta imagen de forma programática? Quiero cambiarlo a 'pausa' cuando se presiona el botón de reproducción.

Sé que puede inicializar un UIBarButtonItem con un identificador pero todavía no he encontrado la manera de cambiarlo después de que se haya inicializado. ¿Esto es posible?

Lo único que se me ocurre es quitar el viejo botón e inicializar uno nuevo en su lugar, pero esto parece poco eficiente.

¿Alguna idea?

Respuesta

14

Ok He buscado esta pregunta en Google y encontré sample code from Apple, donde hacen exactamente lo mismo (alternar entre los botones de reproducción/pausa en el botón de la barra de herramientas). Pero en lugar de usar los identificadores de play in y play integrados en UIBarButtonItem, usan un UIButton personalizado y alternan las imágenes personalizadas.

Así que si Apple va por la molestia de crear y alternar imágenes personalizadas en un UIButton en lugar de la incorporada en el juego y la pausa UIBarButtonItem botones entonces yo creo que es bastante seguro decir que no hay manera de cambiar mediante programación el identificador de un UIBarButtonItem.

Esto es lo que ellos (Apple) lo hacen para alternar las imágenes cuando se presiona el botón:

// Call this when the button you want to toggle is pressed: 
[playButton setImage:((p.playing == YES) ? pauseBtnBG : playBtnBG) forState:UIControlStateNormal]; 

Reemplazar p.playing con lo BOOL que desea mantener el estado del botón. playButton es el UIButton personalizado en la barra de herramientas. pauseBtnBG y playBtnBG son las imágenes para alternar.

13

Esto parece que funciona bastante bien:

UIBarButtonItem *oldButton = [myToolBar.items objectAtIndex:1]; 
[myToolBar setItems:[NSArray arrayWithObjects:[myToolBar objectAtIndex:0], [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop target:self action:@selector(tapStopRefreshButton:)],nil] animated:NO]; 
[oldButton release]; 

En este ejemplo tenían una barra de herramientas para una UIWebView y cuando alguien hace clic en Actualizar quería que pasa a STOP. La barra de herramientas solo tenía un espacio flexible y un botón, para alinear el botón a la derecha, así que agarré una referencia al viejo botón, hice uno nuevo con el mismo selector que el anterior, reinicié los botones en la barra de pestañas , y luego soltó el botón original.

No es el más bonito, pero puede usar todos los botones estándar sin tener que anular la (s) clase (s) de botones.

+0

Apple hace esto en el ejemplo de StitchedStreamPlayer: http://developer.apple.com/library/ios/#samplecode/StitchedStreamPlayer/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010092 – pablasso

+0

Aunque técnicamente no ' cambiando 'el 'UIBarButtonSystemItem' como lo está el OP, esta respuesta permite el * reemplazo * de un elemento del sistema con otro. –

+0

Aunque, en este ejemplo, el nuevo 'UIBarButtonItem' debe inicializarse antes de colocarse en la matriz, para que pueda ser liberado correctamente. –

0

¿Qué hay de 2 barras de herramientas apiladas? Luego puede tener algunos botones del sistema en la parte superior y otros en la inferior. Si se presiona el botón de reproducción, simplemente oculte la barra de herramientas superior.

+0

Está buscando cambiar la imagen o cambiar el botón, no tener una barra de herramientas desaparecer. – JoshDM

+0

@JoshDM Sin embargo, si la barra de herramientas desaparece, el botón que se muestra al usuario cambiará. Además, en estos casos normalmente no tiene uno, sino un conjunto de botones que debe cambiar, por lo que me resulta más fácil tener dos barras de herramientas diferentes con UIBarButtonItem estándar en lugar de crear y alternar UIButtons personalizados. También es más fácil 'ocultar' una vista. Pero tienes razón, no es la respuesta a la pregunta, es una respuesta al problema del que pregunta. – FranMowinckel

Cuestiones relacionadas