2016-04-20 72 views
0

所以我一直在試圖BGM添加到我的應用程序,它的工作原理,但每當我切換到其他視圖,然後切換回來,它會再次層中的BGM。 我試過Google搜索,我看到其他人有同樣的問題,我在這裏卡住的唯一的一點是,我不是用Objective-C編碼,我用Swift編碼,除了整個很多泰勒·斯威夫特,我無法找到解決方案d:播放的背景音樂和切換視圖

下面是我用寫的BGM的代碼。

import UIKit 
import AVFoundation 

class ViewController: UIViewController { 

    var ButtonSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("tamborine", ofType: "wav")!) 
    var audioPlayer = AVAudioPlayer() 

    /* var Bgm = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Waiting-in-the-Woods", ofType: "mp3")!), error: nil) */ 

    func playBgMusic(){ 
     let musicPath = NSBundle.mainBundle().pathForResource("Waiting-in-the-Woods", ofType: "mp3") 
     let url = NSURL(fileURLWithPath: musicPath!) 
     audioPlayer = AVAudioPlayer(contentsOfURL: url, error: nil) 
     audioPlayer.numberOfLoops = -1 
     //-1為循環播放 
     audioPlayer.volume = 1 
     audioPlayer.prepareToPlay() 
     audioPlayer.play() 


    } 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     audioPlayer = AVAudioPlayer(contentsOfURL: ButtonSound, error: nil) 

       //Bgm.play() 
    } 

    override func viewWillAppear(animated: Bool) { 

     playBgMusic() 
     if !audioPlayer.playing { 
      audioPlayer.play() 
     } 
    } 

回答

0

在viewWillAppear中,你可以調用playBgMusic(),後者又調用audioPlayer.play()

所以音軌開始在事實是有道理的,因爲這是你要求它做的事。我認爲你需要的邏輯是以下幾條內容。

if !audioPlayer.playing { 
    playBgMusic() 
} 

,或者如果你喜歡的後衛聲明

guard player.playing else { 
    playBgMusic() 
} 
+0

謝謝,我發現我的其他按鈕聽起來audioPlayer被命名爲與我的bgm相同,問題解決後給他們新的名字。 我還有一個問題,我想爲設置頁面創建一個新視圖,關閉bgm和其他聲音,但是我後來意識到我無法從原始頁面調用其他函數和屬性聲音編碼,無論如何,我可以稱他們在一個新的觀點?或者我必須將開關置於與聲音相同的視圖上?謝謝一堆。 :D – Esther

+0

或者我應該單獨發佈另一個問題嗎? :O – Esther

+0

您可以發佈通知並在擁有播放器的控制器上收聽。假設控制器至少未被釋放。 – Dare

0

你實例化一個新的AVAudioPlayer()每次你的看法負荷時間,使新的​​軌道覆蓋前一個(或多個)。

只需讓您的音頻播放器類別爲單例。這也可以讓您隨時控制應用中任何場景/屏幕的音樂。

每當你的主屏幕上的負荷,檢查,看是否音樂已經在播放如果不是,請致電playBgMusic(),否則什麼也不做。

0

您正在構建新的AVAudioPlayer並將其分配給audioPlayer,每次您的視圖加載時(即,當iOS執行override func viewDidLoad()時)。所以當你再次加載視圖時,它是從頭開始創建的,而較舊的可能仍然在工作。