Swift - 如何从函数更新 UILabel

Posted

技术标签:

【中文标题】Swift - 如何从函数更新 UILabel【英文标题】:Swift - How to update UILabel from a function 【发布时间】:2019-03-18 01:12:29 【问题描述】:

我正在制作一个蓝牙应用程序,我想放置 2 个标签来控制我是否已连接并显示 RSSI,所以我编写了这个函数

func updateLabel()
    LRSSI.text = String(RSSINb)
    if(Connected == true)
        LEtat.text = "Connected"
        LEtat.textColor = UIColor.green
    else
        LEtat.text = "Disconnected"
        LEtat.textColor = UIColor.red
    

我在 CBPeripheral 的 ReadRSSI 函数中调用此函数。 我的终端里有这段文字

Main Thread Checker: UI API called on a background thread: -[UILabel setText:]

但是当我旋转手机时,它会更新标签,我试图将“self”放在标签之前。 我也尝试在计时器内调用我的函数,但它给了我一个 SIGBART 错误 那么有没有办法更新标签或重新加载视图控制器?

编辑: 调用我的函数:

 func peripheral(_ peripheral: CBPeripheral, didReadRSSI RSSI: NSNumber, error: Error?) 
    print(RSSI)
    peripheral.readRSSI()

    RSSINb = Int(RSSI) * -1
    updateLabel()
    if(RSSINb > 150)
        WriteValue(valeur: "z")
    

编辑:

What's the proper way in architecture design to avoid UI API to be called on a background thread?

【问题讨论】:

显示调用updateLabel的函数。显然,您需要对其进行更改,以便在主队列中调用它。 我已经编辑了它@rmaddy 见***.com/questions/47066259/…和other posts与错误相关。 【参考方案1】:

问题已解决:

func peripheral(_ peripheral: CBPeripheral, didReadRSSI RSSI: NSNumber, error: Error?) 
    print(RSSI)
    peripheral.readRSSI()

    RSSINb = Int(RSSI) * -1
    DispatchQueue.main.sync 
        updateLabel()
    
    if(RSSINb > 150)
        WriteValue(valeur: "z")
    

【讨论】:

以上是关于Swift - 如何从函数更新 UILabel的主要内容,如果未能解决你的问题,请参考以下文章

将单例从 Objective C 共享到 Swift

如何使用从 Swift 3 中的滑块中选择的 JSON 数据更新 tableviewcell?

在 Swift 中,如何从异步任务外壳内部更新主线程上的文本视图

在更新函数中使用 spriteKit 增加 spriteNode 的大小(Swift)

如何从 Swift 调用 jquery 函数?

如何在 swift 3 中获取和更新 Healthkit 中的高度?