首页 > 解决方案 > 在无法访问以编程方式创建的 UILabel 时定义 #selector 方法

问题描述

如果您以编程方式定义 UILabel,则必须在viewDidLoad()? 但是,如果您要定义一个#selector需要设置所述标签的方法,那么鉴于@objc选择器方法需要在viewDidLoad()方法范围之外,它无法访问标签,这是不可能的。你如何解决这个问题?

class ViewController: UIViewController {
        
    var count = 4
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
                
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: 150, height: 150))
        label.center = CGPoint(x: 250, y: 430)
        label.font = .systemFont(ofSize: 130)
        label.textColor = UIColor.black
        view.addSubview(label)
        
        Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: <#T##Selector#>, userInfo: <#T##Any?#>, repeats: <#T##Bool#>)
        
        
        @objc func updateLabel() { // ERROR @objc can only be used with members of classes...
            if count > 0 {
                count -= 1
                label.text = "\(count)"
            }
        }
    }
}

标签: swiftuikituilabelselectorviewdidload

解决方案


您的错误是您已将选择器updateLabel 放在. viewDidLoad你应该把它放在外面viewDidLoad,让它成为你的类的成员,而不是本地函数。

要访问 中的标签updateLabel,只需将标签的声明移到两个方法之外。

您还应该添加一个timer参数,updateLabel以便您可以在count达到 0 时停止计时器,而不是让计时器永远运行。

var label: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    
    label = UILabel(frame: CGRect(x: 0, y: 0, width: 150, height: 150))
    label.center = CGPoint(x: 250, y: 430)
    label.font = .systemFont(ofSize: 130)
    label.textColor = UIColor.black
    view.addSubview(label)
    
    Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updateLabel), userInfo: nil, repeats: true)
}

@objc func updateLabel(_ timer: Timer) {
    if count > 0 {
        count -= 1
        label.text = "\(count)"
    } else {
       timer.invalidate()
    }
}

推荐阅读