我目前有以下代码,我想在其中更新单击按钮后出现的标签的文本。我无法根据计时器计数器更新文本,因为我认为UI标签未在主线程中更新。但是,我不确定DispatchQueue.main.async()
的放置位置。由于imglabel.text
变量是在imageButtonTap
内部更新的,因此会产生混乱的情况,因为该函数是通过addTarget
调用的。有谁知道我如何更新文本?
var counter = 0
var timer = Timer()
var imglabel = UILabel()
class TaskViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(UpdateTime), userInfo: nil, repeats: true)
var imagesall = UIImage()
let imagesView = UIButton()
imagesView.setImage(imagesall, for: UIControl.State.normal)
imagesView.addTarget(self, action:#selector(TaskViewController.imageButtonTap(_:)), for: .touchUpInside)
self.view.addSubview(imagesView)
}
@objc func imageButtonTap(_ sender:TaskButton!) {
let imageView = UIImageView(image: UIImage(named: img_name))
imageView.backgroundColor = UIColor.clear
imageView.frame = CGRect(x: 0, y: 0, width: sender.frame.size.width, height: sender.frame.size.height)
self.imglabel.frame = CGRect(x: 0, y: 0, width: sender.frame.size.width, height: sender.frame.size.height)
self.imglabel.clipsToBounds = true
self.imglabel.backgroundColor = UIColor.clear
self.imglabel.textAlignment = .center
self.imglabel.text = String(self.counter)
self.imglabel.center = imageView.center
// Puts label on top of image.
UIGraphicsBeginImageContextWithOptions(self.imglabel.bounds.size, false, 0)
imageView.layer.render(in: UIGraphicsGetCurrentContext()!)
self.imglabel.layer.render(in: UIGraphicsGetCurrentContext()!)
let imageWithText = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
sender.setImage(imageWithText, for: UIControl.State.normal)
}
func timerAction() {
counter += 1
imglabel.text = "\(counter)"
}
@objc func imageButtonTap(_ sender:TaskButton!) {
DispatchQueue.main.async {
let imageView = UIImageView(image: UIImage(named: img_name))
imageView.backgroundColor = UIColor.clear
imageView.frame = CGRect(x: 0, y: 0, width: sender.frame.size.width, height: sender.frame.size.height)
self.imglabel.frame = CGRect(x: 0, y: 0, width: sender.frame.size.width, height: sender.frame.size.height)
self.imglabel.clipsToBounds = true
self.imglabel.backgroundColor = UIColor.clear
self.imglabel.textAlignment = .center
self.imglabel.text = String(self.counter)
self.imglabel.center = imageView.center
// Puts label on top of image.
UIGraphicsBeginImageContextWithOptions(self.imglabel.bounds.size, false, 0)
imageView.layer.render(in: UIGraphicsGetCurrentContext()!)
self.imglabel.layer.render(in: UIGraphicsGetCurrentContext()!)
let imageWithText = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
sender.setImage(imageWithText, for: UIControl.State.normal)
}
}