Switch between UIBarButtonSystemItemPlay and UIBarButtonSystemItemPause

Have two UIBarButtonItems that want to make them as one UIBarButtonItem and switch between them

UIBarButtonItem *systemItem1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPlay target:self action:@selector(playaudio:)]; systemItem1.style = UIBarButtonItemStyleBordered; UIBarButtonItem *systemItem2 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPause target:self action:@selector(pause:)]; systemItem2.style = UIBarButtonItemStyleBordered; // flex item used to put space in between buttons UIBarButtonItem *flexItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; //Add buttons to the array NSArray *toolbarItems = [NSArray arrayWithObjects: settingsButton, flexItem, systemItem, flexItem, systemItem1,flexItem, systemItem2, flexItem, systemItem3, flexItem, modalBarButtonItem, nil]; [toolbar setItems:toolbarItems]; [settingsButton release]; [systemItem release]; [systemItem1 release]; [systemItem2 release]; [systemItem3 release]; [modalBarButtonItem release]; [flexItem release]; -(void) playaudio: (id) sender { NSString *filePath = [[NSBundle mainBundle] pathForResource:@"theme" ofType:@"mp3"]; NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:filePath]; audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil]; audioPlayer.currentTime = 0; [audioPlayer play]; [fileURL release]; } - (void)pause: (id)sender { if ([audioPlayer isPlaying]) {[audioPlayer pause];} else {[audioPlayer play];} } 

Any ideas how I can do this.

+3
source share
2 answers

Essentially, every time the play / pause status is updated, you will want to run a method to update the toolbar. Something like this should work. You can create a method like this:

 -(void)playPause{ if(audioPlayer == nil){ NSString *filePath = [[NSBundle mainBundle] pathForResource:@"theme" ofType:@"mp3"]; NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:filePath]; audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil]; audioPlayer.currentTime = 0; [fileURL release]; } UIBarButtonSystemItem buttontype = UIBarButtonSystemItemPlay; if([audioPlayer isPlaying]){ [audioPlayer pause]; } else { [audioPlayer play]; buttontype = UIBarButtonSystemItemPause; } UIBarButtonSystemItem *item = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:buttontype target:self action:@selector(playPause)] autorelease]; self.toolbar.items = [NSArray arrayWithObject:item]; } 
+5
source

I had a much simpler solution to this problem:

 - (void) setStartStopButton:(BOOL)startorstop { UIBarButtonItem *startStopButton = nil; if (startorstop == YES) { startStopButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPause target:self action:@selector(startStopAction:)]; } else { startStopButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPlay target:self action:@selector(startStopAction:)]; } self.navigationItem.rightBarButtonItem = startStopButton; [startStopButton release]; } - (IBAction)startStopAction:(id)sender { if (task.isActive) { [task stopTask]; } else { [task startTask]; } [self setStartStopButton:task.isActive]; } 

And then I call the first method to set the button in viewWillAppear , and also set the button before the view on the screen.

+4
source

Source: https://habr.com/ru/post/981707/


All Articles