2012-01-05 19 views
8

Estoy usando UIBarButtonSystemItemPlay para reproducir mi archivo de audio y quiero cambiar su estilo dinámicamente cuando hago clic en él. ¿Es posible ?, si es así, entonces por favor ayúdame. Este es mi código, donde _playPause es IBOutlet de UIBarButtonSystemItemPlay. Gracias por adelantado.¿Cómo puedo cambiar el estilo de UIBarButtonItem en el código

- (IBAction)playPause:(UIBarButtonItem *) sender 
{ 
    if (_playPause.style == UIBarButtonSystemItemPlay) 
    { 
     [_playPause setStyle:UIBarButtonSystemItemPause]; 
     [audio play]; 
    } 
    else 
    { 
     [_playPause setStyle:UIBarButtonSystemItemPlay]; 
     [audio pause]; 
    } 
} 
+1

¿Has probado con '==' en lugar de '='? ... de todos modos usaría una bandera de ivar bool para verificar si el audio está sonando o no. – Mat

+0

¡Oh, lo siento! Muchas gracias, lo comprobaré y vendré a verlo más tarde. –

+0

Lo he comprobado, pero no funciona. –

Respuesta

0

creo que una vez que el estilo se establece inicialmente (es decir, en constructor de interfaces o cuando se crea el botón en el código) no puede cambiarlo.

Su única otra opción es quitar el botón en el código y crear uno nuevo en su lugar con un estilo diferente. Se podría llamar a este método:

- (id)initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action 

Para obtener más información sobre la UIBarButtonItem echar un vistazo a this.

5

UIBarButtonSystemItemPlay o UIBarButtonSystemItemPause no se puede recuperar por propiedad de estilo. el estilo es del tipo UIBarButtonItemStyle.

Consulte la documentación here.

Sugiero crear dos UIBarButtonItem diferentes y luego habilitarlos o deshabilitarlos (por ejemplo) alternativamente. También es posible eliminar el botón visible actual y agregar uno nuevo con un UIBarButtonSystemItem diferente.

2

Aquí hay una solución muy completa para esto que acabo implementado:

En primer lugar, definimos VARs para mantener los dos botones:

@property (weak, nonatomic) IBOutlet UIToolbar *toolbar; 
@property (strong, nonatomic) IBOutlet UIBarButtonItem *playButton; 
@property (strong, nonatomic) IBOutlet UIBarButtonItem *pauseButton; 

(Mi entendimiento es que la barra de herramientas es una referencia débil, ya que se está definiendo a través de IB y tiene un fuerte puntero, pero los botones reproducir/pausa son indicadores fuertes porque los estamos creando a continuación. Pero mi fu es un poco débil en este frente como bastante novato, por lo que las correcciones son apreciadas.)

Segundo, yo n IB crea solo un botón de reproducción (sin botón de pausa) y lo vincula con la varilla de playButton anterior.

En tercer lugar, la creación de este método:

- (void) setAsPlaying:(BOOL)isPlaying 
{ 
    self.rootViewController.playing = isPlaying; 

    // we need to change which of play/pause buttons are showing, if the one to 
    // reverse current action isn't showing 
    if ((isPlaying && !self.pauseButton) || (!isPlaying && !self.playButton)) 
    { 
     UIBarButtonItem *buttonToRemove = nil; 
     UIBarButtonItem *buttonToAdd = nil; 
     if (isPlaying) 
     { 
      buttonToRemove = self.playButton; 
      self.playButton = nil; 
      self.pauseButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPause 
                      target:self 
                      action:@selector(pauseAudio:)]; 
      buttonToAdd = self.pauseButton; 
     } 
     else 
     { 
      buttonToRemove = self.pauseButton; 
      self.pauseButton = nil; 
      self.playButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPlay 
                      target:self 
                      action:@selector(playAudio:)]; 
      buttonToAdd = self.playButton; 
     } 

     // Get the reference to the current toolbar buttons 
     NSMutableArray *toolbarButtons = [[self.toolbar items] mutableCopy]; 

     // Remove a button from the toolbar and add the other one 
     if (buttonToRemove) 
      [toolbarButtons removeObject:buttonToRemove]; 
     if (![toolbarButtons containsObject:buttonToAdd]) 
      [toolbarButtons insertObject:buttonToAdd atIndex:2]; // vary this index to put in diff spots in toolbar 

     [self.toolbar setItems:toolbarButtons]; 
    } 
} 

En cuarto lugar, llamar setAsPlaying donde quiera que van a jugar o el modo de pausa. Por ejemplo:

-(IBAction) playAudio:(id)sender 
{ 
    [self.audioPlayer play]; 
    [self setAsPlaying:YES]; 
} 

-(IBAction) pauseAudio:(id)sender 
{ 
    [self.audioPlayer pause]; 
    [self setAsPlaying:NO]; 
} 
+0

Además, no necesita usar propiedades 'strong', ya que está volviendo a instanciar' UIBarButtonItem' de todos modos. podría usar una variable local 'UIBarButtonItem' en su método y propiedades' weak'. – Vinzzz

+0

puede recuperar dinámicamente el índice del botón para eliminar, haciendo 'NSInteger index = [toolbarButtons indexOfObject: buttonToRemove]' y luego '[toobarButtons replaceObjectAtIndex: index withObject: buttonToAdd] ' – Vinzzz

+0

@Vinzzz: buenas adiciones, gracias! – mowliv

0

Sí, no se puede cambiar el "estilo" (en realidad no se llama estilo) una vez que se establece.

Sí, puede hacer otro botón que lo solucione.

Aquí es código reutilizable que hace que:

UIBarButtonItem *newButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone 
    target:controller.navigationItem.rightBarButtonItem.target 
    action:controller.navigationItem.rightBarButtonItem.action]; 
controller.navigationItem.rightBarButtonItem = newButton; 

Aquí, el controlador es por lo general self.

Cuestiones relacionadas