如何在多个 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")