我正在创建一个应用程序,它使用了大量的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
,并停止音乐。
在评论中发布您的任何问题。