ios - 使用 uitextfield 条目指定倒数计时器持续时间
问题描述
我正在开发我的第二个应用程序,学习 Swift。我的第一个是一个计算器,它在按下按钮时根据一些 UITextField 输入输出一些结果。
我现在做了一个倒数计时器,通过一个在线教程工作。
如何使用在 UITextField 中输入的数字设置持续时间(“秒”变量)?我试过使用
var seconds = Double(timeSetupField.text!)!
代替
var seconds = 60
但我知道这不起作用,但我不完全确定为什么。属性初始化程序在“self”可用之前运行,但我没有使用“self”。- 我怀疑我误解了什么。变量的使用比我的简单计算器要复杂一些。
任何有关如何实现此功能的建议都会很棒,并且对上述问题的任何解释也非常感谢。
代码:
//
// ViewController.swift
// CountdownTimer
//
// Created by Matt Baines on 01/09/2018.
// Copyright © 2018 Matt Baines. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
// PROPERTIES
@IBOutlet weak var timeSetupField: UITextField!
@IBOutlet weak var timeCountdownLabel: UILabel!
@IBOutlet weak var enterTimeLabel: UILabel!
@IBOutlet weak var pauseButton: UIButton!
@IBOutlet weak var startButton: UIButton!
// DECLARATION OF VARIABLES
// This variable will hold a starting value of seconds.
var seconds = 60
// Timer variable
var timer = Timer()
//This will be used to make sure only one timer is created at a time.
var isTimerRunning = false
// For pause & resume
var resumeTapped = false
override func viewDidLoad() {
super.viewDidLoad()
// Disable pause button so it is not visible until a time is started.
pauseButton.isEnabled = false
}
func runTimer() {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector:(#selector(ViewController.updateTimer)), userInfo: nil, repeats: true)
isTimerRunning = true
pauseButton.isEnabled = true
}
@objc func updateTimer() {
if seconds < 1 {
timer.invalidate()
} else {
// This will decrement the seconds.
seconds -= 1
// This will update the label.
timeCountdownLabel.text = timeString(time: TimeInterval(seconds))
}
}
func timeString(time:TimeInterval) -> String {
let hours = Int(time) / 3600
let minutes = Int(time) / 60 % 60
let seconds = Int(time) % 60
return String(format:"%02i:%02i:%02i", hours, minutes, seconds)
}
@IBAction func startButton(_ sender: UIButton) {
if isTimerRunning == false {
runTimer()
self.startButton.isEnabled = false
}
}
@IBAction func pauseButton(_ sender: UIButton) {
if self.resumeTapped == false {
timer.invalidate()
self.resumeTapped = true
self.pauseButton.setTitle("Resume", for: .normal)
} else {
runTimer()
self.resumeTapped = false
self.pauseButton.setTitle("Pause", for: .normal)
}
}
@IBAction func resetButton(_ sender: UIButton) {
timer.invalidate()
// Manually enter the restarting point for the seconds
seconds = 60
timeCountdownLabel.text = timeString(time: TimeInterval(seconds))
isTimerRunning = false
// Ensure pause button text is set back to pause
self.pauseButton.setTitle("Pause", for: .normal)
pauseButton.isEnabled = false
startButton.isEnabled = true
}
}
解决方案
您是否只是想替换代码行
var seconds = 60
和
var seconds = Double(timeSetupField.text!)!
在上面声明变量的地方?如果是这种情况,这就是您的问题所在。
“Self”,意思是视图控制器,直到 viewDidLoad 才加载。在加载视图之前,您无法访问您的 IBOutlet。您正试图从“不存在”的 IBOutlet 中获取信息。
如果在您的故事板中您已经在 timeSetupField 上设置了一些文本,您可以执行以下操作:
//Global Variables
var seconds = 60
//Life cycle
override func viewDidLoad() {
super.viewDidLoad()
pauseButton.isEnabled = false
// Checks to make sure the timeSetupField.text isn't nil. If it is nil, you will not run any more code within viewDidLoad which prevents a crash on the next line if timeFromTextField is nil.
guard let timeFromTextField = timeSetupField.text else { return }
seconds = timeFromTextField
}
此时您的视图已加载,并且可以访问 timeSetupField.text。您可以使用默认值全局声明秒数,以便您可以在 ViewController 文件中的任何位置访问它,但在插座可用后在 ViewDidLoad 中设置该值。
您可以安全地从代码中的任何函数(如 IBAction)更改您的 seconds 变量,或者在这种情况下,当您在键盘上按 Enter 时调用的函数。
推荐阅读
- c++ - 在类中使用 char 数组时从 'char *' 到 'char' 的无效转换
- javascript - 未捕获的类型错误:无法在 HTMLFormElement.onmouseover 处读取未定义的属性“未定义”
- r - 使用 R 中的二进制表选择列
- unix - 更新后不要重新创建存储库
- php - PHP联系表格没有从另一个php文件中获取所有信息
- python - 如何将返回的 pandas 数据框强制为视图,以便我可以执行转换?
- flutter - AppBar 中的扩展小部件
- java - 如何处理 AWT 框架中的关闭按钮
- python - 在 Python 中如何将命令的输出写入文件
- rust - 在 Rust 中迭代 Vec 的替代元素的最佳方法是什么?