如何在多个 UIView 中使用一个函数
How can I use a function in several UIView
通常情况下,当我想在视图中播放声音时,我必须:
- 导入 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()
}
//
}
}
当我想播放声音时,我只调用函数 playsound。
但是现在,我想播放声音可以在多个视图中使用。我不知道该怎么做。我已经尝试创建一个新的 Swift 文件调用 SoundFunction 并将我的辅助播放声音方法添加到我的 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()
但是我得到一个错误"Missing argument for parameter #1 in call"
我不知道如何为多个视图调用相同的函数。请帮忙
在这一行 SoundFunction.configureAudioSession()
中,您正试图调用一个 class 函数。这不是这里的情况,这就是为什么你会收到错误消息(即使消息没有提到)。
即使您使用 class func configureAudio...
解决了这个问题,您仍然可能会遇到一个问题,一旦您超出范围,您的声音就会停止播放。
为了做你想做的事,你应该做一个singleton
。您为 SoundFunction
编写的代码似乎是一个好的开始。稍作修改即可完成。
这是我的 Q/A:
我的评论在底部:
SoundPlayer.swift
: http://pastebin.com/eX4iv3S4 .
To be used like so : SoundPlayer.sharedInstance.playSound().
Currently it use only one sound (because that is what I wanted), but you could easily add a parameter to the playSound method for example.
请告诉我是否对您有帮助:)
编辑:
使用我的代码,您应该:更改 playSound
方法以添加参数,就像您在自己的代码中所做的那样。最后,确保您应用到 AVAudioSession
的类别是最适合您的类别。
来自@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")
通常情况下,当我想在视图中播放声音时,我必须: - 导入 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()
}
//
}
}
当我想播放声音时,我只调用函数 playsound。
但是现在,我想播放声音可以在多个视图中使用。我不知道该怎么做。我已经尝试创建一个新的 Swift 文件调用 SoundFunction 并将我的辅助播放声音方法添加到我的 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()
但是我得到一个错误"Missing argument for parameter #1 in call"
我不知道如何为多个视图调用相同的函数。请帮忙
在这一行 SoundFunction.configureAudioSession()
中,您正试图调用一个 class 函数。这不是这里的情况,这就是为什么你会收到错误消息(即使消息没有提到)。
即使您使用 class func configureAudio...
解决了这个问题,您仍然可能会遇到一个问题,一旦您超出范围,您的声音就会停止播放。
为了做你想做的事,你应该做一个singleton
。您为 SoundFunction
编写的代码似乎是一个好的开始。稍作修改即可完成。
这是我的 Q/A:
我的评论在底部:
SoundPlayer.swift
: http://pastebin.com/eX4iv3S4 .To be used like so : SoundPlayer.sharedInstance.playSound().
Currently it use only one sound (because that is what I wanted), but you could easily add a parameter to the playSound method for example.
请告诉我是否对您有帮助:)
编辑:
使用我的代码,您应该:更改 playSound
方法以添加参数,就像您在自己的代码中所做的那样。最后,确保您应用到 AVAudioSession
的类别是最适合您的类别。
来自@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")