Swift 是否可以通过编程方式更新UILabel文本,该文本在随后通过选择器调用的函数中更新?
我目前有以下代码,我想更新按钮点击后出现的标签文本。我无法根据计时器计数器获取要更新的文本,因为我认为UI标签没有在主线程中更新。但是,我不确定在哪里放置Swift 是否可以通过编程方式更新UILabel文本,该文本在随后通过选择器调用的函数中更新?,swift,xcode,uilabel,swift5,Swift,Xcode,Uilabel,Swift5,我目前有以下代码,我想更新按钮点击后出现的标签文本。我无法根据计时器计数器获取要更新的文本,因为我认为UI标签没有在主线程中更新。但是,我不确定在哪里放置DispatchQueue.main.async()。由于imglabel.text变量在imagebuttonap内更新,这会造成混乱的情况,因为函数是通过addTarget调用的。有人知道我如何更新文本吗 var counter = 0 var timer = Timer() var imglabel = UILabel() cla
DispatchQueue.main.async()
。由于imglabel.text
变量在imagebuttonap
内更新,这会造成混乱的情况,因为函数是通过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)"
}
您可以在action方法中添加
DispatchQueue.main.async
。
将imagesView创建为实例方法,而不是在vieDidLoad中创建
let imagesView = UIButton()
override func viewDidLoad() {
super.viewDidLoad()
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(UpdateTime), userInfo: nil, repeats: true)
var imagesall = UIImage()
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!) {
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)
}
}
您可以在action方法中添加
DispatchQueue.main.async
。
将imagesView创建为实例方法,而不是在vieDidLoad中创建
let imagesView = UIButton()
override func viewDidLoad() {
super.viewDidLoad()
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(UpdateTime), userInfo: nil, repeats: true)
var imagesall = UIImage()
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!) {
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)
}
}
我为您的情况编写了如下代码,希望对您有所帮助
class ViewController: UIViewController {
var counter = 0
var timer = Timer()
var imglabel = UILabel()
var button = UIButton(frame: CGRect(x: 50, y: 50, width: 150, height: 50))
let imageView = UIImageView(image: UIImage(named: "auricular-phone-symbol-in-a-circle"))
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let imagesall = UIImage(named: "favorite-heart-button")
button.setImage(imagesall, for: UIControl.State.normal)
button.addTarget(self, action:#selector(self.imageButtonTap(_:)), for: .touchUpInside)
self.view.addSubview(button)
}
@objc func imageButtonTap(_ sender:UIButton!) {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
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
}
@objc func timerAction() {
self.counter += 1
self.imglabel.text = "\(self.counter)"
UIGraphicsBeginImageContextWithOptions(self.imglabel.bounds.size, false, 0)
imageView.layer.render(in: UIGraphicsGetCurrentContext()!)
self.imglabel.layer.render(in: UIGraphicsGetCurrentContext()!)
let imageWithText = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
button.setImage(imageWithText, for: UIControl.State.normal)
}
}
UILabel的主要功能不是更新bcz,而是使用UIGraphicsImageContext显示文本,但在更新功能中,您只更新lable.text,这样它就不会更新文本
还有一件事,如果我知道是正确的,当你点击按钮时,应该放计数计时器,当你在viewDidLoad中创建计时器时,bcz,如果你停留5秒,然后点击按钮,这个数字将是5,而不是0。我为你的情况编写了如下代码,希望这对你有所帮助
class ViewController: UIViewController {
var counter = 0
var timer = Timer()
var imglabel = UILabel()
var button = UIButton(frame: CGRect(x: 50, y: 50, width: 150, height: 50))
let imageView = UIImageView(image: UIImage(named: "auricular-phone-symbol-in-a-circle"))
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let imagesall = UIImage(named: "favorite-heart-button")
button.setImage(imagesall, for: UIControl.State.normal)
button.addTarget(self, action:#selector(self.imageButtonTap(_:)), for: .touchUpInside)
self.view.addSubview(button)
}
@objc func imageButtonTap(_ sender:UIButton!) {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
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
}
@objc func timerAction() {
self.counter += 1
self.imglabel.text = "\(self.counter)"
UIGraphicsBeginImageContextWithOptions(self.imglabel.bounds.size, false, 0)
imageView.layer.render(in: UIGraphicsGetCurrentContext()!)
self.imglabel.layer.render(in: UIGraphicsGetCurrentContext()!)
let imageWithText = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
button.setImage(imageWithText, for: UIControl.State.normal)
}
}
UILabel的主要功能不是更新bcz,而是使用UIGraphicsImageContext显示文本,但在更新功能中,您只更新lable.text,这样它就不会更新文本
还有一件事,如果我知道是正确的,当你点击按钮时,应该放计数计时器,当你在ViewDiLoad中创建计时器时,bcz,如果你停留5秒,然后点击按钮,这个数字将是5而不是0。即使把它放在action方法中,文本仍然不会更新。它似乎只有在我点击它时才会更新,从而重新启动“循环”。
viewDidLoad
是正确的调用吗?添加一个断点并检查imageButtonTap是否正在调用?谢谢,似乎只有在执行单击时标签才会更新。似乎只有完成轻拍手势后图像才会更新。点击手势是否可能会覆盖自然更新?您在哪里使用点击手势?即使将其放入动作方法中,文本仍然不会更新。它似乎只有在我点击它时才会更新,从而重新启动“循环”。viewDidLoad
是正确的调用吗?添加一个断点并检查imageButtonTap是否正在调用?谢谢,似乎只有在执行单击时标签才会更新。似乎只有完成轻拍手势后图像才会更新。点击手势可能会覆盖自然更新吗?您在哪里使用点击手势?