私は私がする素敵な整頓解決策を見つけることができません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()
}
だけでなく、それぞれの時間を停止し、プレーヤーを起動してみたが、私はまだお互い上で遊んで同じ音楽の複数のコピーを取得します。同じ名前の複数の音楽プレーヤーが停止できないか、バックグラウンドで実行されている同じビューコントローラーが複数コピーされているかのようです。
私はおそらくここに絶対に根本的な何かが欠けていますことを認識しますが、グーグルはその答えを私に提供するために失敗していると私はスタックオーバーフローの良い人が私をがっかりさせないであろうことを知っています。
ありがとうございました。
'if(musicPlayer == nil)'、あなたの 'musicPlayer'が' nil'ならあなたはおそらくそれを再作成したいでしょう。おそらくあなたは 'if(musicPlayer!= nil)'を意味していたでしょうか? –
申し訳ありません。私がやっていることは、まだ演奏されていない場合にのみ音楽を始めることです。 – Westside
あなたの 'if(!musicPlayer.playing)'がそれを達成するはずです。 'AVAudioPlayer'を作成している場所はどこですか? –