在每个视图控制器中创建音乐实例

Creating Music Instance in every View Controller

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

最好的方法是什么?

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

然后任何时候你需要改变音乐你简单地调用相应的方法,例如AudioManager.sharedInstance 来自任何地方,当您在应用程序中继续移动时,音乐将继续播放。

您可能希望在您的 AppDelegate 或 First 中启动音乐ViewController。

例如,对于您提供的代码,您可能需要类似

的内容
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,并停止播放音乐。

Post有什么问题可以在评论区留言。