根据RSSI值更新UILabel颜色

问题描述 投票:0回答:1

我正在开发一个使用BLE连接到微控制器的应用程序。我现在已经完成所有这些工作,也可以从BLE链接读取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)
     }     
 }
ios swift label uilabel rssi
1个回答
0
投票

由于您在ViewController中定义了故事板中的UILabel,因为@IBOutlet weak var RSSILabel: UILabel!意味着您没有以编程方式创建RSSILabel。这意味着你不需要做self.view.addSubview(RSSILabel)。此外,您可以避免每次为每个if情况设置字体系列,因为它们都具有相同的。并且可能可以避免使serial?在某些时候可能是零,所以更好地检查它,因为你声明它是可选的然后通过对编译器说它你知道它与serial!不是零。 UI的更改也应该在主线程中发生,并且可能是在更改UILabel颜色时你不在主线程中,所以我在那里推出了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
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.