如何通过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
相关产品推荐
相关产品推荐

