Почему моя функция обновления для моего UISlider не работает для установки текущего времени воспроизведения в MPMusicPlayerController? - PullRequest
0 голосов
/ 25 августа 2011

Настройка

В настоящее время я занимаюсь разработкой музыкального приложения, и у меня возникают проблемы со слайдером индикатора выполнения.

self.musicPlayer является [MPMusicPlayerController applicationMusicPlayer]

self.currentlyPlayingTotalDuration является NSNumber

self.currentlyPlayingTimeSlider является UISlider


Обзор

Приведенный ниже код выполняется при выборе новой песни в MPMusicPlayerController. В этом методе (не все из которых показаны) я настроил свой музыкальный проигрыватель на воспроизведение выбранной песни (, рабочая ) и ее воспроизведение (, рабочая ). Затем я установил полную продолжительность песни на максимальное значение ползунка (, рабочий )

self.currentlyPlayingTotalDuration = [[NSNumber alloc] initWithFloat:(int)[NSValue valueWithPointer:[self.musicPlayer.nowPlayingItem valueForKey:MPMediaItemPropertyPlaybackDuration]]];    
[self.currentlyPlayingTimeSlider setMaximumValue:self.currentlyPlayingTotalDuration.floatValue];

Я зарегистрировал значения, чтобы увидеть, правильно ли установлены значения ( они )

NSLog(@"Number:%@", [NSNumber numberWithFloat:(int)[NSValue valueWithPointer:[self.musicPlayer.nowPlayingItem valueForKey:MPMediaItemPropertyPlaybackDuration]]]);
NSLog(@"Max:%f", self.currentlyPlayingTimeSlider.maximumValue);

Вывод журнала ниже, выглядит как надо

2011-08-24 13:38:25.004 App [1241:707] Number:1107392
2011-08-24 13:38:25.009 App [1241:707] Max:1400544.000000

А затем я установил для currentlyPlayingTimeSlider значение 0, чтобы начать ( работает )

self.currentlyPlayingTimeSlider.value = 0.0;

Затем я настроил свой метод updateSliderTime на вызов один раз в секунду, чтобы переместить индикатор выполнения на одну секунду дальше ( работает )

[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateSliderTime:) userInfo:nil repeats:YES];

Проблемы

Полный код метода приведен ниже для updateSliderTime метода, который не работает , даже если он вызывается каждую секунду

- (void)updateSliderTime:(NSTimer *)timer {
    [self.currentlyPlayingTimeSlider setValue:[[NSNumber numberWithDouble:self.musicPlayer.currentPlaybackTime] floatValue]];
}

Также ниже приведен метод, который я вызываю для события valueChanged, которое я настроил в Интерфейсном Разработчике. Также не работает

- (IBAction)sliderChanged:(id)sender {
    [self.musicPlayer setCurrentPlaybackTime:[[NSNumber numberWithFloat:self.currentlyPlayingTimeSlider.value] doubleValue]];
}

Может кто-нибудь помочь мне понять, что я делаю не так? Это должно быть что-то в этих двух последних методах, так как первый вызывает нормально. Я больше не занимаюсь настройкой / манипуляциями с ползунком где-либо еще.

Ответы [ 2 ]

3 голосов
/ 25 августа 2011

Вы проверяли, что ваш IBAction вызывается (возможно, с NSLog)? Если нет, убедитесь, что вы установили делегат Slider.

В противном случае, проверьте мой ответ на этот вопрос, который очень похож.

1 голос
/ 25 августа 2011

Разобрался. На самом деле все работало так, как должно, кроме установки максимального значения для слайдера. Я сделал это странным образом. Вместо:

self.currentlyPlayingTotalDuration = [[NSNumber alloc] initWithFloat:(int)[NSValue valueWithPointer:[self.musicPlayer.nowPlayingItem valueForKey:MPMediaItemPropertyPlaybackDuration]]];

Я должен использовать:

self.currentlyPlayingTotalDuration = [self.musicPlayer.nowPlayingItem valueForKey:MPMediaItemPropertyPlaybackDuration];

Значение уже число. Спасибо Mundi за то, что он мотивировал меня записать стоимость. Когда я это сделал, я понял, что это уже было плавание. Глупый я :) 1007 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...