Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 是否可以通过编程方式更新UILabel文本,该文本在随后通过选择器调用的函数中更新?_Swift_Xcode_Uilabel_Swift5 - Fatal编程技术网

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

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

我目前有以下代码,我想更新按钮点击后出现的标签文本。我无法根据计时器计数器获取要更新的文本,因为我认为UI标签没有在主线程中更新。但是,我不确定在哪里放置
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是否正在调用?谢谢,似乎只有在执行单击时标签才会更新。似乎只有完成轻拍手势后图像才会更新。点击手势可能会覆盖自然更新吗?您在哪里使用点击手势?