【问题标题】:Updating UILabel Colors based on RSSI Values根据 RSSI 值更新 UILabel 颜色
【发布时间】:2019-03-07 10:34:10
【问题描述】:

我正在开发一个使用 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】:

    由于您在 Storyboard 中定义了 UILabel,并且在 ViewController 中定义为 @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
                }
            }
        }
    

    【讨论】:

    • 感谢您的回复!我现在开始工作了。我现在可以看到我的代码需要一些清理。我只是在我的 readrssi 计时器中调用了 showRssiInLabel 函数。谢谢!
    • @Wolfgang 可能要么接受这个作为正确答案,要么发布正确答案,这样我们就可以看到问题已经结束并在未来得到解决:) 干得好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多