是否可以以编程方式更新在通过选择器调用的函数中更新的UILabel文本?

问题描述 投票:0回答:1

我目前有以下代码,我想在其中更新单击按钮后出现的标签的文本。我无法根据计时器计数器更新文本,因为我认为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)"
    }
swift xcode uilabel swift5
1个回答
0
投票
@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) } }
© www.soinside.com 2019 - 2024. All rights reserved.