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

如何通过UITextField控制UIProgressView进度并使用User Defaults保存

当然可以实现!完全不需要依赖计时器,直接通过用户输入来控制UIProgressView,还能把进度值存在UserDefaults里。我给你梳理几个关键步骤,跟着走就能搞定:

核心实现步骤

1. 准备UIProgressView和输入控件

首先你需要一个进度条和接收用户输入的控件(比如UITextField或者UISlider,这里以文本输入为例):

  • 代码方式创建:
    在视图控制器的viewDidLoad里初始化并布局进度条和输入框:
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 创建进度条
        let progressView = UIProgressView(progressViewStyle: .default)
        progressView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(progressView)
        
        // 创建输入框
        let inputField = UITextField()
        inputField.borderStyle = .roundedRect
        inputField.placeholder = "输入0-1之间的数值(或0-100百分比)"
        inputField.keyboardType = .decimalPad
        inputField.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(inputField)
        
        // 创建更新按钮
        let updateBtn = UIButton(type: .system)
        updateBtn.setTitle("更新进度", for: .normal)
        updateBtn.addTarget(self, action: #selector(updateProgress), for: .touchUpInside)
        updateBtn.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(updateBtn)
        
        // Auto Layout约束
        NSLayoutConstraint.activate([
            progressView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 80),
            progressView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
            progressView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),
            
            inputField.topAnchor.constraint(equalTo: progressView.bottomAnchor, constant: 30),
            inputField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
            inputField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),
            
            updateBtn.topAnchor.constraint(equalTo: inputField.bottomAnchor, constant: 20),
            updateBtn.centerXAnchor.constraint(equalTo: view.centerXAnchor)
        ])
        
        // 保存引用(方便后续使用)
        self.userProgressView = progressView
        self.progressInputField = inputField
    }
    
    // 声明全局引用
    var userProgressView: UIProgressView!
    var progressInputField: UITextField!
    
  • Storyboard方式:
    直接拖一个Progress View、UITextField和Button到界面,分别关联IBOutlet(比如userProgressView、progressInputField)和IBAction(按钮的点击事件)。

2. 处理用户输入并更新进度

在按钮的点击事件里,校验输入的有效性,更新进度条并保存到UserDefaults:

@objc func updateProgress() {
    guard let inputText = progressInputField.text, !inputText.isEmpty else {
        showAlert(message: "请输入有效数值")
        return
    }
    
    // 支持两种输入方式:0-1的小数,或者0-100的百分比
    var progressValue: Float
    if let value = Float(inputText) {
        if value >= 0 && value <= 1 {
            progressValue = value
        } else if value >= 0 && value <= 100 {
            progressValue = value / 100
        } else {
            showAlert(message: "请输入0-1或0-100之间的数值")
            return
        }
    } else {
        showAlert(message: "输入格式错误,请输入数字")
        return
    }
    
    // 更新进度条
    userProgressView.progress = progressValue
    // 保存到UserDefaults
    UserDefaults.standard.set(progressValue, forKey: "userSavedProgress")
    // 收起键盘
    progressInputField.resignFirstResponder()
}

// 封装提示弹窗
func showAlert(message: String) {
    let alert = UIAlertController(title: "提示", message: message, preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "确定", style: .default))
    present(alert, animated: true)
}

3. 加载保存的进度值

在视图控制器初始化完成后,读取UserDefaults里保存的进度,恢复进度条状态:

override func viewDidLoad() {
    super.viewDidLoad()
    // 读取保存的进度,默认值为0.0
    let savedProgress = UserDefaults.standard.float(forKey: "userSavedProgress")
    userProgressView.progress = savedProgress
    // 把保存的值显示在输入框(以小数形式)
    progressInputField.text = String(format: "%.2f", savedProgress)
}

小提醒:UserDefaults适合存储轻量的用户偏好数据,进度值这种小数据完全没问题。如果需要存储更复杂的数据,才考虑用Core Data或者其他持久化方式。

内容的提问来源于stack exchange,提问作者N.Lucas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:52:48