[英]AVAudioPlayer continues to play after segue and relaunches on return to original view controller - how can I stop it?
我在AVAudioPlayer
上遇到了一個奇怪的小問題,我找不到一個很好的整潔解決方案。 我正在使用以下功能在應用程序的菜單屏幕中播放一些背景音樂:
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()
}
到現在為止還挺好。
菜單上有幾個按鈕,它們可以通過界面創建器中創建的序列將用戶帶到其他屏幕-無需編程序列。
第一個問題是加載其他屏幕時音樂會繼續播放。 實際上,在大多數情況下,這是一種很好的效果,但是我想知道是否有辦法停止它,除了創建包含musicPlayer.stop()
或musicPlayer.pause()
菜單按鈕動作之外。 例如,一個視圖控制器可以停止在另一個視圖控制器中啟動的AVAudioPlayer
嗎?
我遇到的最嚴重的問題是,當我導航回到菜單屏幕時(同樣,通過啟動創建segue的界面構建器的按鈕),音樂的副本開始在原始音樂上播放(聽起來很糟糕),似乎沒有任何方法可以停止它或檢查它是否正在播放。 如果單擊更多菜單選項,然后從菜單中返回,則將開始播放更多的音樂副本。
我試過了
if (!musicPlayer.playing) {
musicPlayer.play()
}
和
if (musicPlayer == nil) {
musicPlayer.play()
}
以及每次停止和啟動播放器,但我仍然可以從同一首音樂的多個副本中相互播放。 就像有多個不能停止播放的同名音樂播放器,或在后台運行同一視圖控制器的多個副本一樣。
我意識到我可能在這里根本缺少一些基本知識,但是Googling未能為我提供答案,而且我知道Stack Overflow的好人不會讓我失望。
謝謝。
在主視圖控制器的viewWillDisappear
,可以stop
AVAudioPlayer
。
例如:
override func viewWillDisappear(animated: Bool) {
musicPlayer.stop()
}
原來...
這與我在界面生成器中構建segues的方式有關(這可能一直都是錯誤的)。 如果您從按鈕ctrl拖動到視圖控制器以創建segue,然后執行相同操作(從按鈕ctrl拖動回到第一個視圖控制器)以創建“后退” segue,則這似乎會創建多個實例AVAudioPlayer(或可能是整個菜單視圖控制器)的聲音,這會由於相互播放的多個音樂版本而造成討厭的效果。
但是,如果使用UNWIND segue返回菜單,則音樂會一直播放,但返回菜單后不會重新開始。 整潔。
為了在需要停止的菜單選項中停止音樂,唯一的方法似乎是先停止音樂然后以編程方式調用segue的動作。
在界面生成器中創建所有segue既快速又容易,但是顯然在某些情況下總是需要代碼行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.