iOS开发需求:根据UITextField输入次数点击按钮播放音频
实现按输入整数次数播放音频的iOS解决方案
嘿,我帮你把代码补全并优化了,完美实现点击按钮后按文本框输入的次数播放指定音频。先看完整代码:
import UIKit import AVFoundation class ViewController: UIViewController, AVAudioPlayerDelegate { @IBOutlet weak var playCountTextField: UITextField! // 把原来的命名改成更清晰的playCountTextField @IBOutlet weak var playButton: UIButton! // 需要在Storyboard里拖一个按钮并关联这个IBOutlet var audioPlayer: AVAudioPlayer? var targetPlayCount = 0 var currentPlayCount = 0 override func viewDidLoad() { super.viewDidLoad() // 初始化音频播放器 setupAudioPlayer() // 添加点击空白处收起键盘的手势 let tapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)) view.addGestureRecognizer(tapGesture) } // 初始化音频播放器,包含错误处理 private func setupAudioPlayer() { guard let path = Bundle.main.path(forResource: "example.mp3", ofType: nil) else { print("找不到音频文件example.mp3,请确认文件已添加到项目中") return } let audioURL = URL(fileURLWithPath: path) do { audioPlayer = try AVAudioPlayer(contentsOf: audioURL) audioPlayer?.delegate = self // 设置代理监听播放完成事件 audioPlayer?.prepareToPlay() // 提前加载音频,提升播放流畅度 } catch { print("初始化音频播放器失败: \(error.localizedDescription)") } } // 按钮点击事件,触发播放逻辑 @IBAction func playButtonTapped(_ sender: UIButton) { dismissKeyboard() // 验证输入的有效性:必须是大于0的整数 guard let countText = playCountTextField.text, let count = Int(countText), count > 0 else { showAlert(title: "输入错误", message: "请输入一个大于0的整数") return } // 重置播放计数 targetPlayCount = count currentPlayCount = 0 // 开始第一次播放 audioPlayer?.play() playButton.isEnabled = false // 播放期间禁用按钮,避免重复触发 } // AVAudioPlayer代理方法:播放完成时自动触发 func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { if flag { currentPlayCount += 1 if currentPlayCount < targetPlayCount { // 未达到目标次数,继续播放下一次 player.play() } else { // 完成所有播放,恢复按钮状态 playButton.isEnabled = true print("已完成指定次数的播放") } } else { print("播放失败,终止播放流程") playButton.isEnabled = true } } // 收起键盘 @objc private func dismissKeyboard() { view.endEditing(true) } // 显示错误提示弹窗 private func showAlert(title: String, message: String) { let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) present(alert, animated: true) } }
关键细节说明:
- 命名优化:把原代码里的
sam改成playCountTextField,让代码可读性更高 - 音频初始化:添加了错误处理逻辑,避免找不到音频文件时崩溃;提前调用
prepareToPlay()让播放启动更流畅 - 输入验证:点击按钮时会检查输入是否为有效正整数,无效时弹出友好提示
- 播放计数逻辑:通过
AVAudioPlayerDelegate监听播放完成事件,每播放完一次自动计数,直到达到目标次数 - 用户体验优化:播放期间禁用按钮防止重复触发;添加收起键盘的手势,方便用户操作
注意事项:
- 确保你的项目中已经添加了
example.mp3音频文件,并且在Target的Copy Bundle Resources列表里能找到它 - 在Storyboard中需要创建一个按钮,关联
playButton的IBOutlet和playButtonTapped的IBAction - 必须给
ViewController添加AVAudioPlayerDelegate协议,才能监听播放完成事件
内容的提问来源于stack exchange,提问作者user8105388
相关产品推荐
相关产品推荐

