簡體   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