【问题标题】:Why does the AVAudioPlayer stop method not work when switching views为什么切换视图时AVAudioPlayer停止方法不起作用
【发布时间】:2016-06-30 15:47:20
【问题描述】:

我有一个 iphone 应用程序,它显示图像并播放从主菜单中选择的音频。

用户点击一个按钮来选择他们想要的图像/音频组合。用动画切换视图的代码工作正常。

在新视图中显示图像、播放、暂停、擦洗和停止音频的所有代码也都可以正常工作。

但是,当用户单击主菜单按钮时,我希望停止播放音频。我正在使用 viewWillDisappear:(BOOL)animated 来调用 stop 方法:

-(void)viewWillDisappear:(BOOL)animated {
audioPlayer.stop;
[super viewWillDisappear: animated];}

当用户切换回主菜单视图时,此代码不会停止声音。有一个更好的方法吗?我是不是做错了什么?

这是上面 sn-p 所在的整个类的代码:

#import "twelthPoem.h"

UIImageView *largeImageView;

@implementation twelthPoem

-(void)resetControls
{
audioPlayer.currentTime = 0;
scrubber.value = 0;
[playButton setImage:[UIImage imageNamed:@"play_HL.png"] 
    forState:UIControlStateNormal];
}

-(void)play:(id)sender {


if (! audioPlayer.playing)  {
audioPlayer.play;
[playButton setImage:[UIImage imageNamed:@"pauseHL.png"] forState:UIControlStateNormal];
}
else {
audioPlayer.pause;
[playButton setImage:[UIImage imageNamed:@"play_HL.png"]          forState:UIControlStateNormal];
}

[self becomeFirstResponder];
}

-(void)stop:(id)sender {

audioPlayer.stop;
[self resetControls];
}

-(void)changeVolume:(id)sender {

audioPlayer.volume = volume.value;
[self becomeFirstResponder];
}

-(void)scrub:(id)sender {

if (audioPlayer.playing) {

audioPlayer.pause;
audioPlayer.currentTime = scrubber.value;
audioPlayer.play;
}
else
audioPlayer.currentTime = scrubber.value;
[self becomeFirstResponder];
}

-(void)createControls {

//play/pause button
playButton = [UIButton buttonWithType:UIButtonTypeCustom];
[playButton setFrame:CGRectMake(60,405,80,20)];
[playButton setImage:[UIImage imageNamed:@"play_HL.png"] forState:UIControlStateNormal];
[playButton addTarget:self action:@selector(play:) 
 forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:playButton];

//stop button
stopButton = [UIButton buttonWithType:UIButtonTypeCustom];
[stopButton setFrame:CGRectMake(180,405,80,20)];
[stopButton setImage:[UIImage imageNamed:@"stopHL.png"] forState:UIControlStateNormal];
[stopButton addTarget:self action:@selector(stop:) 
 forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:stopButton];

//volume control
volume = [[UISlider alloc] initWithFrame:CGRectMake(10,445,145,20)];
[volume addTarget:self action:@selector(changeVolume:) 
 forControlEvents:UIControlEventValueChanged];
volume.minimumValue = 0.0;
volume.maximumValue = 1.0;
volume.value = audioPlayer.volume;
volume.continuous = YES;
[self.view addSubview:volume];

//scrubber control
scrubber = [[UISlider alloc] initWithFrame:CGRectMake(165,445,145,20)];
[scrubber addTarget:self action:@selector(scrub:) 
   forControlEvents:UIControlEventValueChanged];
scrubber.minimumValue = 0.0;
scrubber.maximumValue = audioPlayer.duration;
scrubber.value = audioPlayer.currentTime;
scrubber.continuous = NO;
[self.view addSubview:scrubber];

}

- (void)remoteControlReceivedWithEvent:(UIEvent *)event {

switch (event.subtype)
{
case UIEventSubtypeRemoteControlTogglePlayPause:
    [self play:nil];
    break;

case UIEventSubtypeRemoteControlNextTrack:
    //do nothing
    break;

case UIEventSubtypeRemoteControlPreviousTrack:
    //do nothing
    break; 
}
}

- (BOOL)canBecomeFirstResponder {

return YES;
}

-(void)viewDidLoad {    

//for scrolling the image

[super viewDidLoad];

CGRect scrollFrame = CGRectMake(0,40,320,350);
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:scrollFrame];
scrollView.minimumZoomScale = 1.0;
scrollView.maximumZoomScale = 1.5;
scrollView.delegate = self;


UIImage *bigImage = [UIImage imageNamed:@"birches.png"];



largeImageView = [[UIImageView alloc] initWithImage:bigImage];


[scrollView addSubview:largeImageView];
scrollView.contentSize = largeImageView.frame.size; //important!



[self.view addSubview:scrollView];

[scrollView release];


//for playing the recording

NSString *filePath = [[[NSBundle mainBundle] resourcePath] 
          stringByAppendingPathComponent:@"birches_final_mp3.mp3"]; 
NSURL *fileURL = [NSURL fileURLWithPath:filePath];

NSError *error = nil;

OSStatus status = AudioSessionInitialize(NULL, NULL, NULL, NULL);    
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
status = AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, 
                  sizeof (sessionCategory), 
                  &sessionCategory);
AudioSessionSetActive(YES);

audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL 
                         error:&error];

      if (error )
    NSLog(@"An error occurred: %@",error);
        else
    {
    audioPlayer.volume = 0.3;
    [audioPlayer prepareToPlay];

    [self createControls];  
    } 

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return largeImageView;
}

- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player 
{
    interrupted = audioPlayer.playing;
}

- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player 
{
    if (interrupted)
    audioPlayer.play;
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player 
               successfully:(BOOL)flag 
{
    [self resetControls];
}




-(void)viewWillDisappear:(BOOL)animated {
    audioPlayer.stop;
    [super viewWillDisappear: animated];    

}

- (void)dealloc {

    [[UIApplication sharedApplication] endReceivingRemoteControlEvents];
    [scrubber release];
    [volume release];
    [audioPlayer release];

    [super dealloc];
}

@end

【问题讨论】:

    标签: iphone ios xcode avaudioplayer


    【解决方案1】:

    您使用以下语法调用objective-c中的方法。

    [audioPlayer stop];
    

    audioPlayer.stop 将不起作用。

    其他地方也一样。

    【讨论】:

    • -(void)stop:(id)sender { audioPlayer.stop; [自我重置控制]; }
    • 我是否需要在所有地方更改语法 - 即使它正在工作?
    • 您确定您的stop: 方法有效吗?您肯定会重置 currentTime,因此音乐可能会重新开始,但是在您的 stop 方法中,没有实际停止 audioPlayer 的代码。 audioPlayer.stop 只是查询停止布尔值。
    • 所以我从 audioPlayer.stop 更改了我的停止方法;使用 [audioPlayer 停止];我的停止按钮和以前一样。当我单击按钮时,两个版本都停止播放音频。但是,将 [audioPlayer stop];在 -(void)viewWillDisappear:(BOOL)animated 或 - (void)dealloc 中什么也不做。这是代码:-(void)viewWillDisappear:(BOOL)animated { [audioPlayer stop]; [超级viewWillDisappear:动画]; }
    【解决方案2】:

    audioPlayer.stop 将不起作用,主要是因为它后面需要一个表达式,例如audioPlayer.stop = //expression,stop 是bool,所以你可以说audioPlayer.stop = YES;[audioPlayer stop];

    【讨论】:

    • audioPlayer.stop = YES;引发代码错误 - 它说是未声明
    • 我遇到了同样的问题。实际上 [audioPlayer stop] 不会停止播放器。我已经设置了一个断点并且知道它会到达这个语句。使用 Xcode 4.1
    • 好吧,就我而言,这是一个我不完全了解其生命的停用对象的情况。当您是新手时,这并不容易理解,但我想确认这是我的代码,而不是 Xcode 环境。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多