swift - 在无法访问以编程方式创建的 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()
}
}
推荐阅读
- dynamic - 如何在 Rust 中清除 libloading 的内部缓存
- php - Tinymce sink 元素减少页面加载时间
- php - 如何在特定条件下将值存储在一个会话中
- flutter - 无法保存动画小部件列表的状态
- javascript - 如何在单击按钮时使用钩子和 Redux 触发 API 调用
- arangodb - ArangoDB 键/值模型:值最大大小
- r - 通过分组和计数来区分两个变量的案例
- google-cloud-platform - 从谷歌云上的存储桶下载文件
- python - 如何在 Python 中找到包含坐标的点的邻居?
- python - 如何使用范围列表索引 numpy 数组?