如何让audioplayer再次播放?

时间:2012-03-01 06:53:28

标签: iphone ios uiview uiviewcontroller avaudioplayer

我有2个视图控制器,我在第一个视图控制器中播放AVAudioPlayer音乐。 我转到第二个视图控制器并停止音乐:

[audioPlayer stop];    
[UIView beginAnimations:@"Curl View" context:nil];
        [UIView setAnimationDuration:0.5];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
        [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
        [self.view addSubview:secondController.view];
        [UIView commitAnimations];

当我再次回到第一个视图控制器时,我想再次播放我的音乐,但代码不会再次触摸viewDidLoad。 这是我的代码:

[UIView beginAnimations:@"Flipping View" context:nil];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view.superview cache:YES];
    [self.view removeFromSuperview];
    [UIView commitAnimations];

请与我分享一些解决方案或代码后执行的内容。提前谢谢

3 个答案:

答案 0 :(得分:2)

发生这种情况只是因为您从viewDidLoad拨打音乐播放代码 并且viewDidLoad方法只调用一次ViewController

您应该使用viewWillAppear而不是viewDidLoad方法来调用您的代码(播放音乐)。

I suggest you should read UIViewControler Documentation.

更新后的答案:因为您想在加载时播放音乐文件并返回查看。 关于性能可能存在一些问题。 因为您立即调用音乐文件加载视图时间。 因此,请查看下面的解释线。

  • ViewDidLoad - 在视图控制器将其视图层次结构加载到内存后调用此方法。无论视图层次结构是从nib文件加载还是在loadView方法中以编程方式创建,都会调用此方法。您通常会覆盖此方法以对从nib文件加载的视图执行其他初始化。

  • ViewWillAppear:当这个被调用时,这意味着iPhone已经准备好向用户显示UIView了,你在这里做的任何重量都会以非常明显的方式影响性能(如动画被延迟,或播放音乐等)。

  • ViewDidAppear :最后,这通知视图控制器其视图已添加到视图层次结构中。因此,此方法足以完成此类任务,例如播放音乐文件。注意 - - >您必须在实施中的某个时刻致电super

答案 1 :(得分:1)

viewWillAppear:中写下你的播放代码,当你的视图出现时,它会被调用。 viewDidLoad:仅为视图控制器调用一次

<强>更新 使用这些行删除第二个视图

[super viewWillAppear:animated];
UIView beginAnimations:@"Flipping View" context:nil]; 
[UIView setAnimationDuration:0.5]; 
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationEnded)];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view.superview cache:YES];
[self.view removeFromSuperview];
[UIView commitAnimations];

删除视图时将调用此方法

- (void)animationEnded{ 
    NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/BGMCover2.mp3", [[NSBundle mainBundle] resourcePath]]]; 
    NSError *error; audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; audioPlayer.numberOfLoops = -1; 
    [audioPlayer play]; 
}

答案 2 :(得分:0)

在开始申请之前,请深入了解UIViewController的生命周期。您可以点击以下链接: UIViewController Life Cycle