2016-05-29 2 views
2

私は私がする素敵な整頓解決策を見つけることができませんAVAudioPlayerとの奇妙な小さな問題を抱えています。私は私のアプリのメニュー画面にいくつかの背景音楽を再生するには、以下の機能を使用しています:AVAudioPlayerは、セグ後に再生を続け、元のView Controllerに戻ったときに再起動します。どのように停止できますか?

func startMusic() { 
    do { 
     try musicPlayer = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("menu_music", ofType: "mp3")!)) 
    } catch let err as NSError { 
     print (err.debugDescription) 
    }  
    musicPlayer.prepareToPlay() 
    musicPlayer.numberOfLoops = -1 
    musicPlayer.play() 
} 

私はこのようなviewDidLoadでそれを呼び出す:

override func viewDidLoad() { 
     super.viewDidLoad()    
     startMusic()   
    } 

これまでのところは良いです。いいえ、プログラムsegues -

メニューは、すべてのインターフェイスビルダーで作成されているseguesを経由して他の画面にユーザーを取るいくつかのボタンがあります。

最初の問題は、他の画面がロードされたときに音楽が演奏に運ぶということです。これは実際にはほとんどの場合、素敵な、望ましい効果であるが、私はmusicPlayer.stop()またはmusicPlayer.pause()が含まれるメニューボタンのアクションを作成するよりも、他のそれを止める方法があるかどうかを知りたいのです。たとえば、1つのコントローラを表示して別のコントローラで起動したAVAudioPlayerを停止できますか?

私が抱えているより深刻な問題は、メニュー画面(再び、インターフェイスビルダを作成したボタンを介して)に戻ると、元の恐ろしいと思う)、それを止めたり、再生しているかどうかを確認する方法はないようです。より多くのメニューオプションがクリックされてから返された場合、さらに多くのコピーが再生を開始します。

私は

if (!musicPlayer.playing) { 
    musicPlayer.play() 
} 

if (musicPlayer == nil) { 
    musicPlayer.play() 
} 

だけでなく、それぞれの時間を停止し、プレーヤーを起動してみたが、私はまだお互い上で遊んで同じ音楽の複数のコピーを取得します。同じ名前の複数の音楽プレーヤーが停止できないか、バックグラウンドで実行されている同じビューコントローラーが複数コピーされているかのようです。

私はおそらくここに絶対に根本的な何かが欠けていますことを認識しますが、グーグルはその答えを私に提供するために失敗していると私はスタックオーバーフローの良い人が私をがっかりさせないであろうことを知っています。

ありがとうございました。

+0

'if(musicPlayer == nil)'、あなたの 'musicPlayer'が' nil'ならあなたはおそらくそれを再作成したいでしょう。おそらくあなたは 'if(musicPlayer!= nil)'を意味していたでしょうか? –

+0

申し訳ありません。私がやっていることは、まだ演奏されていない場合にのみ音楽を始めることです。 – Westside

+0

あなたの 'if(!musicPlayer.playing)'がそれを達成するはずです。 'AVAudioPlayer'を作成している場所はどこですか? –

答えて

1

は、それは私が(すべてに沿って、おそらく間違っていた)インタフェースビルダでseguesを建てた方法で行うことだ...

が判明。あなたは「戻る」セグエを作成するために、セグエを作成するために、ビューコントローラのボタンからドラッグをCtrlキーと同じ(背面最初のビューコントローラへのボタンからCTRL-ドラッグ)を行う場合、これは複数のインスタンスを作成するように見えますAVAudioPlayer(またはおそらく全体のメニュービューコントローラー)の中にあり、これはお互いに再生している複数のバージョンの音楽に起因する厄介な効果を作り出します。

もつともあなたが戻ってメニューに取得するUNWINDセグエを使用する場合、音楽が全体に果たしているが、メニューに戻るには、再び起動しません。きちんとした

これを停止する必要があるメニュー選択の音楽を停止するには、音楽を停止してプログラムでセグを呼び出すアクションが唯一の方法であるように見えます。

インターフェイスビルダーのすべてのセグを簡単かつ簡単に作成できますが、コード行が常に必要な場合があります。

2

メインビューコントローラーのviewWillDisappearには、のAVAudioPlayerと入力できます。例えば

override func viewWillDisappear(animated: Bool) { 
    musicPlayer.stop() 
} 
+0

ありがとう、それは良いスタートです。これにより、メニュー選択の音楽は停止しますが、メニューに戻るとプレーヤーが複製を開始することなく、セカンダリ画面が表示されている間に再生を続行する方法を知っていますか? – Westside

関連する問題