swift - 计时器计数但不显示
问题描述
我刚开始学习如何编码和说英语^^
当我从 secondViewController 转到 ViewController 时,计时器启动。标签显示计时器。
我的问题是,当我第二次从 secondViewController 转到 ViewController 时,标签没有显示计时器。但是计时器继续计数(我打印出来了)。为什么标签不锁计时器?
我将非常感谢您的帮助
视图控制器
var habit = 0
var statusFirst = false
class ViewController: UIViewController {
var firstTitel = ""
var secondTitels = ""
var timerTime = 0
var timer = Timer()
@IBOutlet weak var titelLabel: UILabel!
@IBOutlet weak var dateLabel: UILabel!
@IBOutlet weak var secondTitel: UILabel!
@IBOutlet weak var secondDate: UILabel!
@objc func processTimer() {
timerTime += 1
dateLabel.text = String(timerTime)
print(timerTime)
}
override func viewDidLoad() {
super.viewDidLoad()
// Hide Label - START
print(habit)
if habit == 0 {
titelLabel.isHidden = true
secondTitel.isHidden = true
dateLabel.isHidden = true
secondDate.isHidden = true
timer.invalidate()
}else if habit == 1 {
titelLabel.isHidden = false
secondTitel.isHidden = true
dateLabel.isHidden = false
secondDate.isHidden = true
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.processTimer), userInfo: nil, repeats: true)
}else if habit == 2 {
titelLabel.isHidden = false
secondTitel.isHidden = false
dateLabel.isHidden = false
secondDate.isHidden = false
}
// Hide Label - END
let titelObject = UserDefaults.standard.object(forKey: "firstTitel")
if let titel = titelObject as? String {
titelLabel.text = titel
}
let titellObject = UserDefaults.standard.object(forKey: "secondTitel")
if let titell = titellObject as? String {
secondTitel.text = titell
}
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
第二视图控制器
class SecondViewController: UIViewController {
var titelSecondViewController = ""
var dateSecondViewController = 0
@IBOutlet weak var titelField: UITextField!
@IBOutlet weak var dateField: UITextField!
@IBOutlet weak var okButton: UIButton!
@IBAction func okButtonAction(_ sender: Any) {
titelSecondViewController = titelField.text!
if let datefield = dateField.text {
if datefield == "" {
dateSecondViewController = 0
}else{
dateSecondViewController = Int(datefield)!
}
}else{
print("lol")
}
}
override func viewDidLoad() {
super.viewDidLoad()
}
// Segue - Start
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toViewController" {
let viewController = segue.destination as! ViewController
habit += 1
print(habit)
if habit == 1 {
statusFirst = true
UserDefaults.standard.set(titelSecondViewController, forKey: "firstTitel")
}else if habit == 2{
UserDefaults.standard.set(titelSecondViewController, forKey: "secondTitel")
}else{
return
}
}
}
// Segue - End
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
解决方案
在第一种情况下habit = 1
,调用计时器
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.processTimer), userInfo: nil, repeats: true)
由于计时器具有强引用并且您不在invalidate()
内部viewDidDisappear
,因此在您关闭它后它会将 VC 保留在内存中
//
在第二次habit = 2
中,您没有在 if 语句中初始化时间,那么第二个实例的标签(呈现的那个)不会更新,而隐藏的被解雇的标签会更新
推荐阅读
- reactjs - 尝试在Formik中更改onChange时无法输入
- java - List.stream 映射非静态方法不能从静态上下文中引用
- javascript - SyntaxError:无法在模块 Typescript 错误之外使用 import 语句
- discord - 机器人旨在随机标记服务器中的某人仅标记自身
- javascript - JS全局变量在函数范围之外没有改变
- node.js - MERN stack 如何将联系人添加到组?
- python - 无法使用 Python 3.9 转换 mp3
- graph - 在邻接表中计算入度的复杂度是O(|E|)?
- windows - 自定义屏幕保护程序 - windows
- android - Firebase StreamBuilder 错误