0

我试图让我的 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
    }

}

查看上下文

4

2 回答 2

0

你的错误信息:// Error: Cannot find 'breathCounter' in scope提供了一个很好的线索......这都是关于范围的。

UILabelViewDidLoad()方法中声明你的,这就是它所在的地方;这就是它的范围。完成后ViewDidLoad,*poof *UILabel从内存中消失。

您需要做的是将您let breathCounter = UILabel()的 ViewDidLoad 移到外面,以便它与您的 ViewController 一起创建;那么只要您的 ViewController 存在于内存中,您就可以引用它。

于 2021-10-13T20:34:45.207 回答
0

如果您在视图控制器上声明为breathCounter属性(就像numberOfBreaths您为viewDidLoadnextBreathTimer

class ViewController: UIViewController {

    var numberOfBreaths = 0
    let breathCounter = UILabel()
    var timer : Timer?

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

在里面createTimer

self.timer = Timer.scheduledTimer(timeInterval: 3.5, target: self, selector: #selector(nextBreath), userInfo: nil, repeats: true)
于 2021-10-13T20:29:48.093 回答