我有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];
请与我分享一些解决方案或代码后执行的内容。提前谢谢
答案 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