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



我正在创建一个应用程序,它使用了大量的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)
        }

最好的方法是什么?

您可能正在寻找Singleton模式,因为您需要一个任何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,并停止音乐。

在评论中发布您的任何问题。

相关内容

  • 没有找到相关文章

最新更新