2016-01-04 55 views
-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) 
     } 

什么是做到这一点的最好方法是什么?

回答

1

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

然后,当你需要改变音乐时,你可以简单地调用相应的方法。 AudioManager.sharedInstance从任何地方,当你不断移动应用程序的音乐将继续。

您可能想要在AppDelegate或FirstViewController中启动音乐。

例如,代码你给,你可能只要你写AudioManager.sharedInstance.startMusic()sharedInstance静态变量将被初始化(一次,因为它是一个静态属性)要像

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 
} 

和那么将调用startMusic()

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

发表您在评论中有任何问题。

+0

所以我需要创建一个新的Swift文件,每次我想播放或停止音乐时实现一个类和子类? –

+0

它的工作!感谢你的回答。但是,所以我可以更好地理解这个概念,代码中sharedInstance常量的作用是什么?我没搞懂 –

+0

@ZéMoreira当你需要某件东西时,使用Singleton模式,并且你希望它可以从多个地方访问。您的AudioPlayer就是一个很好的例子,因为它在整个应用程序中都是活着的,它的使用位置应该没有关系。 “sharedInstance”的原因是双重的:1.明确声明这个“实例”或对象的副本由任何使用它的人共享,2.因此你可以拥有实例变量/函数。我们通过使它成为“静态”来保证只有一个,这意味着它属于AudioEngine类。 –

相关问题