2012-03-01 17 views
2

私は2つのView Controllerを持っており、最初のView ControllerでAVAudioPlayerで音楽を再生します。 は、私は2番目のビューコントローラに移動し、音楽を停止します。私は再び最初のビューコントローラへ行くとき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]; 

私のコードは

答えて

1

が書くあなたがviewWillAppear:でコードを弾く事前にthat..Thanks後に実行するもの、いくつかのソリューションまたはを共有してください、それが呼び出されたときに、今までに、ビューが表示されます。 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]; 

あなたの2番目のビューを削除するには、これらの行を使用して、ビューが

- (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を実行しません。私はコンソールからもそれを見て、それはコンパイラによって触れられていません。もう少し細かいことはできますか? –

+0

あなたのviewDidAppearメソッド定義を表示できますか? –

+0

NSLog(@ "表示されました"); \t NSURL * url = [NSURL fileURLWithPath:[NSString stringWithFormat:@ "%@/BGMCover2.mp3"、[[NSBundle mainBundle] resourcePath]]]; \t NSError * error; \t audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:urlエラー:&error]; \t audioPlayer.numberOfLoops = -1; \t [audioPlayer play]; –

2

削除されたときに、このメソッドが呼び出されますこれはあなたの音楽再生コードをviewDidLoadから に、そしてviewDidLoadメソッド呼び出しは1回限りViewControllerです。

viewDidLoadメソッドの代わりにviewWillAppearからコードを呼び出す(音楽を再生する)必要があります。

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を実行しません。私はコンソールからもそれを見て、それはコンパイラによって触れられていません。もう少し細かいことはできますか? –

+0

@Alex Moskalevは(ViewDidAppear)メソッドで 'super'を呼び出しました。実装のある時点で 'super'を呼び出さなければなりません。 – Kamarshad

+0

[UIView commitAnimations]の前に[super viewDidAppear:YES]を追加しますが、それでも動作しません。私は間違っているの? –

0

アプリケーションを実行する前に、UIViewControllerのライフサイクルについて深く知ってください。 UIViewController Life Cycle

関連する問題