-1

私は、sfx と BGM をたくさん使用するアプリを作成しています。しかし、View Controller を介してこのタイプのデータを継承する最良の方法が見つかりません。すべての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)
        }

それを行う最善の方法は何ですか?

4

1 に答える 1

1

任意の ViewController が対話できる、バックグラウンド ミュージックの単一の正規インスタンスが必要なため、 Singleton パターンを探している可能性があります。

次に、音楽を変更する必要があるときはいつ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静的変数が初期化され (静的プロパティであるため 1 回)、startMusic()呼び出されます。

後で呼び出すと、以前に初期化AudioManager.sharedInstance.stopMusic()したものと同じものが使用されsharedInstance、音楽が停止します。

コメントに質問があれば投稿してください。

于 2016-01-04T22:07:42.860 に答える