在无法访问以编程方式创建的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)"
            }
        }
    }
}

解决方法

您的错误是您将选择器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()
    }
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...