簡體   English   中英

搜索完畢后,AVAudioPlayer繼續播放,並在返回到原始視圖控制器后重新啟動-如何停止它?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM