2012-03-01 76 views
2

我有2个视图控制器,我用AVAudioPlayer在第一个视图控制器中播放音乐。 我去第二视图控制器和停止音乐:如何让audioplayer再次玩?

[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]; 

请分享我的一些解决方案还是什么that..Thanks后的代码执行预先

回答

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]; 
} 
+0

我加void void viewWillAppear,当我从secondController返回时,编译器不执行viewWillAppear。我从控制台看它也没有被编译器触及。你能稍微详细一点吗? – 2012-03-01 08:54:56

+0

你能否显示你的viewDidAppear方法定义。 – 2012-03-01 09:22:28

+0

NSLog(@“View Did Appear”);您可以使用NSURL * url = [NSURL fileURLWithPath:[NSString stringWithFormat:@“%@/BGMCover2.mp3”,[[NSBundle mainBundle] resourcePath]]]; \t NSError * error; \t audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; \t audioPlayer.numberOfLoops = -1; \t [audioPlayer play]; – 2012-03-01 09:30:33

2

这个方法会被称为发生这种情况仅因您正在拨打您的音乐播放代码viewDidLoadviewDidLoad方法调用只有一次对于ViewController

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

I suggest you should read UIViewControler Documentation.

更新答:当你想在加载时播放的音乐文件,并即将返回查看。 在性能方面可能存在一些问题。 因为您立即调用音乐文件加载视图时间。 查看下面的解释行。

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

  • viewWillAppear中:当这个被调用,这意味着iPhone已经准备好了UIView显示给用户,并且任何重物,你在这里做会非常明显地影响性能(如被延迟动画,或播放音乐等)。

  • ViewDidAppear:最后,这会通知其观点,加入到一个视图hierarchy.so这种方法对于这样的任务,例如像播放音乐file.Note足够好的视图控制器 - >您必须调用super在你的实现中的某个时刻。

+0

我加了void void viewDidAppear,当我从secondController返回时,编译器不执行viewDidAppear。我从控制台看它也没有被编译器触及。你能稍微详细一点吗? – 2012-03-01 08:54:29

+0

@Alex Moskalev是否在那个(ViewDidAppear)方法中调用了'super'。你必须在你实现的某个时候调用'super'。 – Kamarshad 2012-03-01 09:01:51

+0

我在第二控制器的[UIView commitAnimations]之前添加了[super viewDidAppear:YES],但它仍然不起作用。我做错了什么? – 2012-03-01 09:16:51

0

在做你的应用程序之前,请深入了解UIViewController的生命周期。你可以按照下面的链接: UIViewController Life Cycle