swift - 音频播放按钮 - 开始、停止
问题描述
我是 swift 新手,在此先感谢您的帮助。我正在设计音频播放按钮。下面是代码。按钮将显示“开始”和“停止”。单击“开始”后,在播放音频时按钮显示“停止”,这是正确的。问题是在完成整个音频文件播放后,以下代码无法自动将按钮显示从“停止”翻转回“开始”。在按两次返回“开始”之前,它卡在“停止”。
@IBAction func didTapButton() {
if let player = player, player.isPlaying {
// Stop playback
button.setTitle("start", for: .normal)
player.stop()
}
else {
// set up player, and play
button.setTitle("stop", for: .normal)
let urlString = Bundle.main.path(forResource: "go", ofType: "mp3")
do {
try AVAudioSession.sharedInstance().setMode(.default)
try AVAudioSession.sharedInstance().setActive(true, options: .notifyOthersOnDeactivation)
guard let urlString = urlString else {
return
}
player = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: urlString))
guard let player = player else {
return
}
player.play()
}
catch {
print("something went wrong")
}
}
}
解决方案
您需要AVAudioPlayerDelegate
为播放器实现和设置委托
player.delegate = self
然后更新按钮标题:
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
button.setTitle("start", for: .normal)
}
推荐阅读
- macos - SM-* 命令在使用命令“emacs -nw”在 iterm2 中运行时无法被 Emacs 识别
- matlab - 有没有一种有效的方法来测量从单个点到大量点阵列中每个点的距离?
- c# - 表单提交 - 为每个字段添加额外的参数并在服务器上读取它们
- python-3.x - 如何从已经使用networkx创建的多个节点添加多个边?
- python - Airflow 1.10.2 未将日志写入 S3
- amazon-web-services - 如何在 Redshift(亚马逊)中更新 UDF?
- heroku - 无法在“main”中找到应用程序对象“app”-Heroku CLI
- r - 检查数据框中的特定行组中是否存在值
- r - 缓存矩阵的逆
- ios - 如何将从 ftp URL 检索到的数据转换为 Swift 中的可用对象