2016-07-26 117 views
0

我的代码应该在按下按钮时播放C大调尺度的波形文件。点击一个单独的停止按钮将停止播放并将当前时间重置为零。iOS Swift AVAudioPlayer如何在完成播放时将currentTime重置为零

@IBAction func onPlayButtonClick(sender: UIButton) 
{ 
    play.enabled = false 
    let path = NSBundle.mainBundle().pathForResource("cmajor", ofType: "wav")! 
    let url = NSURL(fileURLWithPath: path) 
    do 
    { 
     scalePlayer = try AVAudioPlayer(contentsOfURL: url) 
     scalePlayer.prepareToPlay() 
     scalePlayer.enableRate = true 
     scalePlayer.rate = 0.75 
     scalePlayer.play() 
    } 
    catch 
    { 

    } 

} 

它按预期工作,但如何在文件播放结束时将currentTime设置为零?我在开发人员文档上找不到任何内容。

回答

0

你必须设置一个委托:

scalePlayer.delegate = self

然后你实现这个回调

func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) { 
    //set the current time here 
    scalePlayer.currentTime = 0 
} 

更新

这是基于一个例子,你如何实现这个(在你的代码上):

class MyViewController: UIViewController, AVAudioPlayerDelegate { 

    @IBOutlet weak var play: UIButton! 

    private var scalePlayer: AVAudioPlayer? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let path = NSBundle.mainBundle().pathForResource("cmajor", ofType: "wav")! 
     let url = NSURL(fileURLWithPath: path) 
     scalePlayer = try? AVAudioPlayer(contentsOfURL: url) 

     scalePlayer?.delegate = self 
    } 

    @IBAction func onPlayButtonClick(sender: UIButton) { 
     play.enabled = false 
     scalePlayer?.prepareToPlay() 
     scalePlayer?.enableRate = true 
     scalePlayer?.rate = 0.75 
     scalePlayer?.play() 
    } 

    func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) { 
     scalePlayer?.currentTime = 0 
    } 
} 
+0

您能否详细介绍一下?我对此很陌生,我不知道应该在哪里放置这些代码,以及代理人的工作方式。 –

+0

更新了我的回答 – fiks

+0

它编译并立即崩溃,出现此错误:意外发现致命错误nil,同时解包可选值 –

相关问题