正常情况下,当我想在视图中播放时,我必须: - 导入AVFoundation - 为辅助方法制作2个函数:
// MARK: Audio Function
func configureAudioSession() {
self.audioSession = AVAudioSession.sharedInstance()
var categoryError:NSError?
var activeError:NSError?
// set category cho audio session
self.audioSession.setCategory(AVAudioSessionCategoryPlayback, error: &categoryError)
// set active cho audio session
var success = self.audioSession.setActive(true, error: &activeError)
if !success {
println("error making audio session active :\(activeError)")
}
}
func playSound(withName:String, ext:String) {
if let songPath = NSBundle.mainBundle().pathForResource(withName, ofType: ext) {
if let songURL = NSURL(fileURLWithPath: songPath) {
println("songURL: \(songURL)")
var songError:NSError?
// Tao audioplayer
self.player = AVAudioPlayer(contentsOfURL: songURL, error: &songError)
self.player.numberOfLoops = 0
self.player.play()
}
//
}
}
当我想播放声音时我只调用一个函数播放器。
但是现在,我想在几个视图中使用playound。我不知道该怎么做。我已经尝试创建一个新的Swift文件调用SoundFunction并将我的helper playound方法添加到我的SoundFunction.swift中:
import Foundation
import AVFoundation
class SoundFunction {
var audioSession:AVAudioSession!
var player:AVAudioPlayer!
func check() {
println("check")
}
func configureAudioSession() {
self.audioSession = AVAudioSession.sharedInstance()
var categoryError:NSError?
var activeError:NSError?
// set category cho audio session
self.audioSession.setCategory(AVAudioSessionCategoryPlayback, error: &categoryError)
// println("error: \(categoryError)")
// set active cho audio session
var success = self.audioSession.setActive(true, error: &activeError)
if !success {
println("error making audio session active :\(activeError)")
}
}
func playSound(withName:String, ext:String) {
// Lay song path
if let songPath = NSBundle.mainBundle().pathForResource(withName, ofType: ext) {
if let songURL = NSURL(fileURLWithPath: songPath) {
println("songURL: \(songURL)")
var songError:NSError?
// Tao audioplayer
self.player = AVAudioPlayer(contentsOfURL: songURL, error: &songError)
// println("songerror:\(songError)")
self.player.numberOfLoops = 0
self.player.play()
}
//
}
// Chuyen thanh URL
// println("songpath: \(songPath)")
}
}
然后我回到我的视图,并尝试从SoundFunction.Swift调用函数:
SoundFunction.configureAudioSession()
但我收到错误“在参数#1中缺少参数”
我不知道如何为多个视图调用相同的函数。请帮忙
答案 0 :(得分:1)
使用此行SoundFunction.configureAudioSession()
,您尝试调用类函数。这不是这种情况,这就是你收到错误的原因(即使消息没有提到)。
即使您使用class func configureAudio...
修复此问题,您仍然可能会遇到问题,一旦您超出范围,您的声音就会停止播放。
为了做你想做的事,你应该做一个singleton
。您为SoundFunction
编写的代码似乎是一个良好的开端。稍作修改即可完成。
以下是我的Q / A:Swift - AVAudioPlayer, sound doesn't play correctly
我的评论在底部:
SoundPlayer.swift
:http://pastebin.com/eX4iv3S4。如此使用:SoundPlayer.sharedInstance.playSound()。
目前它只使用一种声音(因为这是我想要的),但您可以轻松地将参数添加到playSound方法中。例如。
请告诉我它是否对你有所帮助:)。
修改:
使用我的代码,您应该:更改playSound
方法以添加参数,就像您在自己的代码中所做的那样。最后,请确保您应用于AVAudioSession
的类别是最适合您的类别。
答案 1 :(得分:0)
来自@ Ichamp的建议。我成功创建了一个新的SoundPlayer.swift文件并使用SingleTon来共享功能并在我想要的任何地方使用它:
import Foundation
import AVFoundation
class SoundPlayer {
// Singleton in order to access the player from 'everywhere'
class var sharedInstance : SoundPlayer {
struct Static {
static let instance : SoundPlayer = SoundPlayer()
}
return Static.instance
}
// Properties
var error:NSError?
var audioSession:AVAudioSession!
var player = AVAudioPlayer()
init() {
self.audioSession = AVAudioSession.sharedInstance()
var categoryError:NSError?
var activeError:NSError?
// set category cho audio session
self.audioSession.setCategory(AVAudioSessionCategoryPlayback, error: &categoryError)
// set active cho audio session
var success = self.audioSession.setActive(true, error: &activeError)
if !success {
println("error making audio session active :\(activeError)")
}
}
func playSound(withName:String, ext:String) {
// Lay song path
if let songPath = NSBundle.mainBundle().pathForResource(withName, ofType: ext) {
if let songURL = NSURL(fileURLWithPath: songPath) {
var songError:NSError?
// Tao audioplayer
self.player = AVAudioPlayer(contentsOfURL: songURL, error: &songError)
self.player.numberOfLoops = 0
self.player.play()
}
}
}
}
当我想使用我将使用的功能时:
SoundPlayer.sharedInstance.playSound("restart", ext: "wav")