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

标签 ios swift uikit

尝试在点击时在按钮上设置图像。已验证 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) method .
当您使用直接访问设置图像时,按钮不知道它并在状态更改例程中更改设置图像。
真的你不需要在buton的 Action 方法中改变图像,你只需要 为 states 设置图像并在此方法中更改按钮的状态。按钮将选择合适的图像 for state .

关于ios - 为什么即使在主线程上也需要使用 DispatchQueue.main.async 设置 UIImageView.image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60985114/

相关文章:

ios - GREYActionBlock 返回特定元素属性不起作用

swift - 除法在功能上返回不同的东西

swift:TableViewCell 在滚动之前不会更新约束

swiftui - 如何避免 'Unable to simultaneously satisfy constraints' 错误?

ios - CMAttitudeReferenceFrameXTrueNorthZVertical 不起作用

security - 在 iOS 上,与使用 CFStream、CFNetwork 等安全套接字相比,OpenSSL 有什么好处?

iphone - 获取GKLocalPlayer上面两个好友的分数

ios - Swift - TableView 加载错误 - 可怕的 SIGBART

ios - 你如何实现 UIAccessibility 协议(protocol)?