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];
}
¿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
¡Oh, lo siento! Muchas gracias, lo comprobaré y vendré a verlo más tarde. –
Lo he comprobado, pero no funciona. –