问题描述
如果您以编程方式定义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()
}
}