UISlider no actualiza

Estoy tratando de codificar un reproductor de música para una tarea y estoy atrapado tratando de hacer que el control deslizante se actualice mientras se reproduce la canción. Pude hacerlo para que si el usuario deslizara el control deslizante, la canción se rebobinará / acelerará a esa parte de la canción. ¿Alguien sabe por qué el control deslizante no se actualiza continuamente mientras se reproduce la canción?

Aquí está el file .h

#import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> #import <MediaPlayer/MediaPlayer.h> @interface AS3MPViewController : UIViewController <MPMediaPickerControllerDelegate>{ IBOutlet UIButton *playButton; IBOutlet UIButton *stopButton; IBOutlet UIButton *pauseButton; IBOutlet UISlider *volumeSlider; AVAudioPlayer *musicPlayer; IBOutlet UIButton *pickSongButton; IBOutlet UISlider *timeSlider; NSTimer *timer; } @property (nonatomic, retain) UIButton *playButton; @property (nonatomic, retain) UIButton *stopButton; @property (nonatomic, retain) UIButton *pauseButton; @property (nonatomic, retain) UISlider *volumeSlider; @property (nonatomic, retain) AVAudioPlayer *musicPlayer; @property (nonatomic, retain) UIButton *pickSongButton; @property (nonatomic, retain) UISlider *timeSlider; @property (nonatomic, retain) NSTimer *timer; - (IBAction) play; - (IBAction) stop; - (IBAction) pause; - (IBAction) changeVolume: (UISlider *)sender; - (IBAction) chooseSong: (UIButton *)sender; - (IBAction) changeTime: (UISlider *)sender; - (void)setTimeSliderOptions; @end 

Aquí está el file .m

 #import "AS3MPViewController.h" @interface AS3MPViewController () @end @implementation AS3MPViewController @synthesize playButton = _playButton; @synthesize stopButton = _stopButton; @synthesize pauseButton = _pauseButton; @synthesize musicPlayer = _musicPlayer; @synthesize volumeSlider = _volumeSlider; @synthesize pickSongButton = _pickSongButton; @synthesize timeSlider = _timeSlider; @synthesize timer; - (void)viewDidLoad { [super viewDidLoad]; NSString *filePath = [[NSBundle mainBundle] pathForResource:@"animals001" ofType:@"mp3"]; NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:filePath]; self.musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil]; [self.musicPlayer prepareToPlay]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction) play { [self.musicPlayer play]; } - (IBAction) stop { [self.musicPlayer stop]; self.musicPlayer.currentTime = 0; } - (IBAction) pause { [self.musicPlayer pause]; } - (IBAction) changeVolume: (UISlider *)sender { self.musicPlayer.volume = [sender value]; } - (IBAction)chooseSong:(UIButton *)sender { MPMediaPickerController *mediaPicker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeAnyAudio]; [mediaPicker setDelegate:self]; [mediaPicker setAllowsPickingMultipleItems:NO]; mediaPicker.prompt = NSLocalizedString(@"Add Some Songs To Play", "Prompt In Media Item Picker"); [self presentModalViewController: mediaPicker animated:YES]; } - (void) mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker { [self dismissModalViewControllerAnimated:YES]; } - (void) mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems: (MPMediaItemCollection *)mediaItemCollection { MPMediaItem *item = [[mediaItemCollection items] objectAtIndex:0]; NSURL *url = [item valueForProperty:MPMediaItemPropertyAssetURL]; //AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithURL:url]; //AVPlayer *player = [[AVPlayer alloc] initWithPlayerItem:playerItem]; self.timeSlider.maximumValue = [self.musicPlayer duration]; self.musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [self.musicPlayer play]; timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(songCurrentTime) userInfo:nil repeats:YES]; [self dismissModalViewControllerAnimated:YES]; } - (IBAction)changeTime: (UISlider *)sender { self.musicPlayer.currentTime = self.musicPlayer.duration * sender.value; } - (void)songCurrentTime { timeSlider.value = (self.musicPlayer.currentTime / self.musicPlayer.duration); } @end 

verifique en las conexiones que está conectado el método IBAction con el control deslizante con ValueChanged EX:

 - (IBAction)changeTime: (UISlider *)sender { 

verifique si este método está conectado con ValueChanged mientras la connection IB

Creo que su problema es que está actualizando el valor del control deslizante desde un subprocess que no sea el principal. Intenta modificar el método songCurrentTime para que llame a otro en el hilo principal que actualiza el valor del control deslizante.

 - (void)songCurrentTime { [self performSelectorOnMainThread:@selector(songCurrentTimeMain) withObject:nil waitUntilDone:YES]; } - (void)songCurrentTimeMain { timeSlider.value = (self.musicPlayer.currentTime / self.musicPlayer.duration); } 

Por supuesto, para get resultados correctos, asegúrese de que el valor mínimo del control deslizante sea 0 y el máximo sea 1.

Atentamente

He hecho algo similar en este tutorial y la forma en que agregué un control deslizante fue la misma que tú, excepto por el hecho de que utilicé

musicplayer.currentplaybacktime

como un valor para asignar al slider.

Puede ser que el resultado de (self.musicPlayer.currentTime / self.musicPlayer.duration) sea una asignación inexacta al valor de su control deslizante.

Cuando configura el valor del control deslizante, el valor siempre es inferior o igual a 1 porque self.musicPlayer.currentTime es siempre menor o igual que self.musicPlayer.duration . En cambio, testing esto

 timeSlider.value = self.musicPlayer.currentTime; 

timeSlider y self.timeSlider no son lo mismo. La mayoría de los iVars que ha declarado son innecesarios (y engañosos) porque sintetiza sus properties utilizando el signo de subrayado del nombre de la propiedad. Por ejemplo, usted tiene una propiedad timeSlider respaldada por un _timeSlider iVar y un timeSlider iVar que es completamente diferente.

Utilice self.timeSlider.value = ...