Обновление цветов UILabel на основе значений RSSI - PullRequest
0 голосов
/ 07 марта 2019

Я разрабатываю приложение, использующее BLE для подключения к микроконтроллеру. В настоящее время у меня есть все это и работает, а также читать RSSI по ссылке BLE. Я могу нормально отображать RSSI, чтобы определить уровень сигнала. Но я бы хотел, чтобы дизайн этикетки менял цвета в зависимости от силы сигнала. От 0 до -30 (зеленый), от -30 до -60 (желтый) и от -60 до -90 (красный). Я довольно новый, чтобы быстро. Но я сделал контроллер представления теста диапазона.

Очевидно, мой код просто обновит цвет один раз. Там может быть что-то очень простое, что я скучаю, я просто не могу понять это. Также, возможно, цикл 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)
     }     
 }

1 Ответ

0 голосов
/ 07 марта 2019

Поскольку ваша UILabel в раскадровке определена также в вашем ViewController как @IBOutlet weak var RSSILabel: UILabel!, это означает, что вы не создали RSSILabel программно. Это означает, что вам не нужно делать self.view.addSubview(RSSILabel). Также вы можете избежать установки семейства шрифтов каждый раз для каждого случая if, поскольку все они одинаковы. И, вероятно, можно избежать serial?, который в какой-то момент может быть равен нулю, поэтому лучше проверить его, так как вы объявляете его необязательным, а затем поиграете с ним, сказав компилятору, что вы знаете, что это не ноль с serial!. Кроме того, изменения в пользовательском интерфейсе должны происходить в основном потоке, и это может быть связано с тем, что вы не находитесь в основном потоке при изменении цвета 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
            }
        }
    }
...