UISlider没有更新

时间:2012-11-23 15:09:17

标签: ios objective-c

我正在尝试为一个作业编写一个音乐播放器代码,而我仍然坚持尝试在播放歌曲时让滑块更新。我已经能够做到这一点,如果用户滑动滑块,歌曲将快退/快进到歌曲的那一部分。有谁知道为什么滑块不会随着歌曲的播放而不断更新?

这是.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

这是.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

7 个答案:

答案 0 :(得分:2)

使用带ValueChanged的滑块检查连接IBAction方法的连接 EX:

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

检查此方法是否与IB连接时的ValueChanged连接

答案 1 :(得分:1)

我认为您的问题是您正在从主要线程以外的线程更新滑块的值。尝试修改songCurrentTime方法,以便在主线程上调用另一个更新滑块值的方法。

- (void)songCurrentTime {
[self performSelectorOnMainThread:@selector(songCurrentTimeMain) withObject:nil waitUntilDone:YES];
}

- (void)songCurrentTimeMain {
timeSlider.value = (self.musicPlayer.currentTime / self.musicPlayer.duration);
}

当然要获得正确的结果,请确保滑块的最小值为0,最大值为1.

最好的问候

答案 2 :(得分:0)

设置滑块值时,该值始终小于或等于1,因为self.musicPlayer.currentTime始终小于或等于self.musicPlayer.duration。相反,试试这个

timeSlider.value = self.musicPlayer.currentTime;

答案 3 :(得分:0)

我在this教程中做了类似的事情,我添加滑块的方式和你做的一样,除了我使用的事实

<强> musicPlayer.currentPlaybackTime

作为分配给滑块的值。

可能是(self.musicPlayer.currentTime / self.musicPlayer.duration)的结果是对滑块值的不准确分配。

答案 4 :(得分:0)

timeSliderself.timeSlider不是一回事。您声明的大多数iVar都是不必要的(并且具有误导性),因为您使用属性名称的下划线形式合成属性。例如,您有一个由timeSlider iVar支持的_timeSlider属性,以及一个完全不同的timeSlider iVar。

使用self.timeSlider.value = ...

答案 5 :(得分:0)

对我来说,问题不同,我需要为滑块设置初始值,但这是一个愚蠢的错误,因为我在设置最大值和最小值之前先更新滑块值。

错误的代码:

float value = [self getSliderDefaultValue];
[slider setValue:value animated:NO];
slider.maximumValue = numberOfSteps;
slider.minimumValue = 0;

工作代码:

slider.maximumValue = numberOfSteps;
slider.minimumValue = 0;
float value = [self getSliderDefaultValue];
[slider setValue:value animated:NO];

希望它会对其他人有帮助!

答案 6 :(得分:0)

在我的情况下,我的UISlider上有透明的视图,我一直在俯视它。