我正在开发一个使用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)
}
}
由于您在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
}
}
}