You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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监听播放完成事件,每播放完一次自动计数,直到达到目标次数
  • 用户体验优化:播放期间禁用按钮防止重复触发;添加收起键盘的手势,方便用户操作

注意事项:

  1. 确保你的项目中已经添加了example.mp3音频文件,并且在Target的Copy Bundle Resources列表里能找到它
  2. 在Storyboard中需要创建一个按钮,关联playButton的IBOutlet和playButtonTapped的IBAction
  3. 必须给ViewController添加AVAudioPlayerDelegate协议,才能监听播放完成事件

内容的提问来源于stack exchange,提问作者user8105388

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:21:57