在每个视图控制器中创建音乐实例
Creating Music Instance in every 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)
}
最好的方法是什么?
您可能正在寻找 Singleton pattern,因为您需要一个规范的背景音乐实例,任何 ViewController 都可以与之交互。
然后任何时候你需要改变音乐你简单地调用相应的方法,例如AudioManager.sharedInstance
来自任何地方,当您在应用程序中继续移动时,音乐将继续播放。
您可能希望在您的 AppDelegate 或 First 中启动音乐ViewController。
例如,对于您提供的代码,您可能需要类似
的内容
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
,并停止播放音乐。
Post有什么问题可以在评论区留言。
我正在创建一个使用大量音效和背景音乐的应用程序。但是我找不到通过视图控制器继承此类数据的最佳方法。我是否必须在每个视图控制器中初始化我的音频?但是,如果我想停止在预览 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 pattern,因为您需要一个规范的背景音乐实例,任何 ViewController 都可以与之交互。
然后任何时候你需要改变音乐你简单地调用相应的方法,例如AudioManager.sharedInstance
来自任何地方,当您在应用程序中继续移动时,音乐将继续播放。
您可能希望在您的 AppDelegate 或 First 中启动音乐ViewController。
例如,对于您提供的代码,您可能需要类似
的内容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
,并停止播放音乐。
Post有什么问题可以在评论区留言。