在每个View Controller中创建音乐实例

时间:2016-01-04 21:59:51

标签: swift uiviewcontroller sfx

我正在创建一个使用大量sfx和背景音乐的应用程序。但我找不到通过View Controllers继承此类数据的最佳方法。我是否必须在每个视图控制器中初始化我的音频?但是,如果我想停止在预览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 个答案:

答案 0 :(得分:1)

你可能正在寻找Singleton pattern,因为你需要一个单一的规范背景音乐实例,任何ViewController都可以与之交互。

然后,只要您需要更改音乐,您就可以调用相应的方法。 AudioManager.sharedInstance来自任何地方,随着您不断浏览应用,音乐将继续播放。

您可能希望在AppDelegate或FirstViewController中启动音乐。

例如,使用您提供的代码,您可能需要类似

的内容
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
}

一旦你写AudioManager.sharedInstance.startMusic()sharedInstance静态变量就会被初始化(一次,因为它是一个静态属性)然后会在它上面调用startMusic()

如果您稍后致电AudioManager.sharedInstance.stopMusic(),它将使用之前初始化的sharedInstance,并停止播放音乐。

发表评论中的任何问题。