我怎样才能在几个UIView中使用一个函数

时间:2015-04-07 05:58:12

标签: ios xcode swift uiview singleton

正常情况下,当我想在视图中播放时,我必须: - 导入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中缺少参数”

我不知道如何为多个视图调用相同的函数。请帮忙

2 个答案:

答案 0 :(得分:1)

使用此行SoundFunction.configureAudioSession(),您尝试调用类函数。这不是这种情况,这就是你收到错误的原因(即使消息没有提到)。

即使您使用class func configureAudio...修复此问题,您仍然可能会遇到问题,一旦您超出范围,您的声音就会停止播放。

为了做你想做的事,你应该做一个singleton。您为SoundFunction编写的代码似乎是一个良好的开端。稍作修改即可完成。

以下是我的Q / A:Swift - AVAudioPlayer, sound doesn't play correctly

我的评论在底部:

  

SoundPlayer.swifthttp://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")