繁体   English   中英

为什么即使在主线程上也需要使用 DispatchQueue.main.async 设置 UIImageView.image

[英]Why does UIImageView.image need to be set using a DispatchQueue.main.async even on the main thread

试图在点击时在按钮上设置图像。 验证 targetAction 处理程序总是在主线程上调用。

这不起作用

@objc func buttonTapped() {
     self.mybutton.imageView?.image = MyObjcClass.getImageNamed("DarkVersion")
}

但这有效:

@objc func buttonTapped() {
    DispatchQueue.main.async { // Does not work without this dispatch
        self.mybutton.imageView?.image = MyObjcClass.getImageNamed("DarkVersion")
    }
}

在调试器上,我可以看到两者都在主线程上

将图像设置为按钮的正确方法是使用setImage(_ image: UIImage?,for state: UIControl.State) 方法
当您使用直接访问设置图像时,按钮不知道它并在状态更改例程中更改设置图像。
实际上,您不需要在按钮的动作方法中更改图像,您只需要为状态设置图像并在此方法中更改按钮的状态。 Button'll为 state选择合适的图像。

来自视图控制器的正确代码应该是:

class ViewController: UIViewController {
    @IBOutlet weak var myButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(buttonTapped))
        myButton.addGestureRecognizer(tapGesture)
    }

    @objc func buttonTapped() {
        self.myButton.setImage( MyObjcClass().getImageNamed("DarkVersion"), for: .normal)

    }
}

哪个都行得通,不同之处在于setImage是用来设置图像的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM