调用UIButton.isHidden = true / false时,视图未更新

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调用UIButton.isHidden = true / false时,视图未更新相关的知识,希望对你有一定的参考价值。

我正在使用xcode 8.2swift来制作一个简单的应用程序。

我使用UIButton在我的视图中添加了一个Interface Builder

我为按钮添加了适当的插座:

@IBOutlet weak var myBtn: UIButton!

我希望这个按钮在开始时隐藏所以在viewDidLoad我设置的是Hidden。像这样:

override func viewDidLoad() {
        super.viewDidLoad() 
        ...
        myBtn.isHidden = true
        ...
        mqttConfig = MQTTConfig(clientId: "iphone7", host: "192.xx.xx.150", port: 18xx, keepAlive: 60)

        mqttConfig.onMessageCallback = { mqttMessage in
            if ( mqttMessage.topic == "status" ) {
                if ( mqttMessage.payloadString?.localizedStandardContains("show") )! {
                    self.showButton = true
                } else if ( mqttMessage.payloadString?.localizedStandardContains("hide")  )! {
                    self.showButton = false
                }
                self.showHideSeatButtons()
            } else {
                // something to do in case of other topics
            }
        }

稍后在代码中我有一个显示/隐藏此按钮的功能。

func showHideButton(){
    if ( self.showButton ) {
        print("button enabled!")
        myBtn.isHidden = false

    } else {
        print("button disabled!")
        myBtn.isHidden = true
    }
}

当我调用此函数时(通过使用MQTT接收某个消息)我得到了打印输出,但是我没有看到该按钮。如果按下我知道按钮的位置,则会显示按钮。

知道这可能会发生什么吗?我现在花了一小时用谷歌搜索这个!请不要建议object-c解决这个问题的方法,因为我不知道object-c

答案

在onMessageCallback块中

替换以下行

self.showHideSeatButtons()

DispatchQueue.main.async {
    self.showHideSeatButtons()
}

注意:UI相关的更改/更新必须由主队列(线程)处理。

另一答案

由于您正在调用服务,因此您可能无法在同一个线程中工作。试试这个:

func showHideButton(){
        DispatchQueue.main.async {
            if (self.showButton ) {
                print("button enabled!")
                self.myBtn.isHidden = false

            } else {
                print("button disabled!")
                self.myBtn.isHidden = true
            }
        }
    }

以上是关于调用UIButton.isHidden = true / false时,视图未更新的主要内容,如果未能解决你的问题,请参考以下文章

无法从 AppDelegate 调用 ViewController 方法

JavaScript基本数据类型,函数对象,表,数组,字符串,函数调用

带有 RecyclerView 的片段:java.lang.IllegalArgumentException:报废或附加的视图可能不会被回收。 isScrap:false isAttached:tru

Swift presentViewController 完成块仅在调试中工作而不在发布中调用

我需要从循环 ajax 调用中为数据分配 id

java中线程状态-死亡