从函数更新标签文本的正确方法是什么?



我试图让我的UILabel的文本自动更新基于循环计时器1的增量。标签与一个变量。我不确定它是否重要,但我正在使用自动布局锚以编程方式做我的UI。

我知道这是不工作的,因为变量生活在ViewDidLoad()之外。我还尝试在一个单独的文件中设置一个UILabel的子类,但我无法找出正确的方法来做到这一点。我有麻烦将变量连接到子类并正确实现didSet。

这是我的视图控制器的相关代码,任何建议或替代方法都是赞赏的。

import UIKit
class ViewController: UIViewController {
var numberOfBreaths = 0

override func viewDidLoad() {
super.viewDidLoad()

view.backgroundColor = .white

let breathCounter = UILabel()
breathCounter.translatesAutoresizingMaskIntoConstraints = false
breathCounter.text = "(numberOfBreaths)"
breathCounter.textAlignment = .center
breathCounter.center = self.view.center
// Irrelevant hidden label code redacted
let startStop = RoundButton()
startStop.translatesAutoresizingMaskIntoConstraints = false
startStop.backgroundColor = .white
startStop.setTitle("breathe", for: .normal)
startStop.setTitleColor(.darkGray , for: .normal)
startStop.layer.borderWidth = 2.5
startStop.layer.borderColor = CGColor(red: 225, green: 225, blue: 0, alpha: 1)
startStop.addTarget(self, action: #selector(self.breathCount), for: .touchUpInside)
view.addSubview(breathCounter)
view.addSubview(holdTimer)
view.addSubview(startStop)
// Anchor code redacted
}
@objc func breathCount(_ sender: RoundButton) {
print("Button Tapped")
createTimer()
}

func createTimer() {
_ = Timer.scheduledTimer(timeInterval: 3.5, target: self, selector: #selector(nextBreath), userInfo: nil, repeats: true)
}
@objc func nextBreath() {
numberOfBreaths += 1
breathCounter.text = "(numberOfBreaths)" // Error: Cannot find 'breathCounter' in scope
print(numberOfBreaths) // Prints expected number to console
}
}

查看上下文

如果您将breathCounter声明为视图控制器上的属性(就像您对numberOfBreaths所做的那样),您将可以从viewDidLoadnextBreath函数访问它。我也会保留一个参考你的Timer

class ViewController: UIViewController {
var numberOfBreaths = 0
let breathCounter = UILabel()
var timer : Timer?

然后在viewDidLoad中,删除现有的let breathCounter = UILabel()行。

And insidecreateTimer:

self.timer = Timer.scheduledTimer(timeInterval: 3.5, target: self, selector: #selector(nextBreath), userInfo: nil, repeats: true)

您的错误信息:// Error: Cannot find 'breathCounter' in scope给出了一个很好的线索…

你宣布UILabelViewDidLoad()中的方法,这就是生活;这就是它的范围。一旦ViewDidLoad完成,*poof *UILabel从内存中消失。

你需要做的是将你的let breathCounter = UILabel()移出ViewDidLoad,这样它就会和你的ViewController一起创建;那么只要你的ViewController存在于内存中,你就可以引用它。

相关内容

  • 没有找到相关文章

最新更新