-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)
        }

最好的方法是什么?

4

1 回答 1

1

您可能正在寻找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您之前初始化的相同,并停止音乐。

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

于 2016-01-04T22:07:42.860 回答