2016-01-04 58 views
-1

我在創建一個應用程序時使用了很多sfx和背景音樂。但我找不到通過視圖控制器來繼承這種類型的數據的最佳方式。我是否必須在每個視圖控制器中初始化我的音頻?但是如果我想停止在預覽VC中啓動的音樂,該怎麼辦?在每個視圖控制器中創建音樂實例

這是我使用的代碼:

do { 
      // Music BG 
      let resourcePath = NSBundle.mainBundle().pathForResource("MusicaBg", ofType: "wav")! 
      let url = NSURL(fileURLWithPath: resourcePath) 
      try musicPlayer = AVAudioPlayer(contentsOfURL: url) 

      // SFX for Button 

      let resourcePath2 = NSBundle.mainBundle().pathForResource("botaoApertado", ofType: "wav")! 
      let url2 = NSURL(fileURLWithPath: resourcePath2) 
      try botaoApertado = AVAudioPlayer(contentsOfURL: url2) 

     } catch let err as NSError { 
      print(err.debugDescription) 
     } 

什麼是做到這一點的最好方法是什麼?

回答

1

您可能正在尋找Singleton pattern,因爲您需要一個規範的背景音樂實例,任何ViewController都可以與之交互。

然後,當你需要改變音樂時,你可以簡單地調用相應的方法。 AudioManager.sharedInstance從任何地方,當你不斷移動應用程序的音樂將繼續。

您可能想要在AppDelegate或FirstViewController中啓動音樂。

例如,代碼你給,你可能只要你寫AudioManager.sharedInstance.startMusic()sharedInstance靜態變量將被初始化(一次,因爲它是一個靜態屬性)要像

class AudioManager { 
    static let sharedInstance = AudioManager() 

    var musicPlayer: AVAudioPlayer? 
    var botaoApertado: AVAudioPlayer? 

    private init() { 
    } 

    func startMusic() { 
    do { 
     // Music BG 
     let resourcePath = NSBundle.mainBundle().pathForResource("MusicaBg", ofType: "wav")! 
     let url = NSURL(fileURLWithPath: resourcePath) 
     try musicPlayer = AVAudioPlayer(contentsOfURL: url) 

     // SFX for Button 
     let resourcePath2 = NSBundle.mainBundle().pathForResource("botaoApertado", ofType: "wav")! 
     let url2 = NSURL(fileURLWithPath: resourcePath2) 
     try botaoApertado = AVAudioPlayer(contentsOfURL: url2) 

    } catch let err as NSError { 
     print(err.debugDescription) 
    } 
    } 
} 

func stopMusic() { // implementation 
} 

和那麼將調用startMusic()

如果您稍後致電AudioManager.sharedInstance.stopMusic(),它將使用您之前初始化的相同sharedInstance並停止音樂。

發表您在評論中有任何問題。

+0

所以我需要創建一個新的Swift文件,每次我想播放或停止音樂時實現一個類和子類? –

+0

它的工作!感謝你的回答。但是,所以我可以更好地理解這個概念,代碼中sharedInstance常量的作用是什麼?我沒搞懂 –

+0

@ZéMoreira當你需要某件東西時,使用Singleton模式,並且你希望它可以從多個地方訪問。您的AudioPlayer就是一個很好的例子,因爲它在整個應用程序中都是活着的,它的使用位置應該沒有關係。 「sharedInstance」的原因是雙重的:1.明確聲明這個「實例」或對象的副本由任何使用它的人共享,2.因此你可以擁有實例變量/函數。我們通過使它成爲「靜態」來保證只有一個,這意味着它屬於AudioEngine類。 –

相關問題