根据 RSSI 值更新 UILabel 颜色

Updating UILabel Colors based on RSSI Values

我正在开发一个使用 BLE 连接到微控制器的应用程序。 我目前拥有所有这些 运行,还可以从 BLE link 读取 RSSI。我能够很好地显示 RSSI,以确定信号强度。但我想设计标签以根据信号强度改变颜色。 0 到 -30(绿色)、-30 到 -60(黄色)和 -60 到 -90(红色)。我是 swift 的新手。但是我做了一个Range测试视图控制器。

显然我的代码只会更新颜色一次。可能有一些非常简单的东西我错过了,我只是不太明白。另外,可能 while 循环或 for-in 可以解决这个问题。但是到目前为止我还没有弄好。

无论如何,如果有人能告诉我应该走哪条路线,我将不胜感激!

代码如下:

 @IBOutlet weak var RSSILabel: UILabel!
 @IBOutlet weak var deviceLabel: UILabel!

 var timer = Timer()
 var progressHUD: MBProgressHUD?

 func serialDidChangeState() {

 }

 func serialDidDisconnect(_ peripheral: CBPeripheral, error: NSError?) 
 {

 }

 override func viewDidLoad() {
   super.viewDidLoad()     
     if (serial?.isReady)! {         
     deviceLabel.text = serial?.connectedPeripheral!.name
     serial?.readRSSI()
     readRssiTimer()
     showRssiInLabel()
     }
}

 func readRssiTimer() {        
     self.timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true, block: { (Timer) in
         serial?.readRSSI()})
 }

 func showRssiInLabel(){
     self.timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true, block: { (Timer) in
         self.RSSILabel.text = serial?.realtimeRSSI.stringValue})

       if (serial?.self.realtimeRSSI.intValue)! > -40 {
         RSSILabel.textColor = UIColor.green

         RSSILabel.font = UIFont(name: "HelveticaNeue", size: CGFloat(22))
         self.view.addSubview(RSSILabel)

     } else if (serial?.realtimeRSSI.intValue)! <= -40 && (serial?.realtimeRSSI.intValue)! > -70 {
         RSSILabel.textColor = UIColor.yellow

         RSSILabel.font = UIFont(name: "HelveticaNeue", size: CGFloat(22))
         self.view.addSubview(RSSILabel)
     } else if (serial?.realtimeRSSI.intValue)! <= -70 && (serial?.realtimeRSSI.intValue)! > -90 {
         RSSILabel.textColor = UIColor.red

         RSSILabel.font = UIFont(name: "HelveticaNeue", size: CGFloat(22))
         self.view.addSubview(RSSILabel)
     }     
 }

由于您在 Storyboard 中定义了 UILabel,并且在 ViewController 中定义了标签,因为 @IBOutlet weak var RSSILabel: UILabel! 意味着您没有以编程方式创建 RSSILabel。这意味着您不需要执行 self.view.addSubview(RSSILabel)。您也可以避免每次都为每个 if 情况设置字体系列,因为它们都相同。并且可能可以避免 serial? 在某些时候可能为零,所以最好检查它,因为你声明它是可选的,然后通过告诉编译器你知道它不是零来玩它 serial!。 UI 的更改也应该发生在主线程中,并且可能是你在更改 UI 标签颜色时不在主线程中,所以我把 DispatchQueue.main.async{} 块放在那里

如果您正在调试检查并且颜色应该能够改变,这应该可以工作:

func showRssiInLabel(){
        if serial != nil {
            self.timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true, block: { (Timer) in
                DispatchQueue.main.async {
                    self.RSSILabel.text = serial!.realtimeRSSI.stringValue
                }
            })

            var labelColor: UIColor = UIColor.green

            if (serial!.self.realtimeRSSI.intValue)! > -40 {
                labelColor = UIColor.green
            } else if (serial!.realtimeRSSI.intValue)! <= -40 && (serial!.realtimeRSSI.intValue)! > -70 {
                labelColor = UIColor.yellow
            } else if (serial!.realtimeRSSI.intValue)! <= -70 && (serial!.realtimeRSSI.intValue)! > -90 {
                labelColor = UIColor.red
            }

            DispatchQueue.main.async {
                RSSILabel.font = UIFont(name: "HelveticaNeue", size: CGFloat(22))
                RSSILabel.textColor = labelColor
            }
        }
    }