在 UIView 中以编程方式创建的 UILabel 未更新
Posted
技术标签:
【中文标题】在 UIView 中以编程方式创建的 UILabel 未更新【英文标题】:Programatically created UILabel within UIView not updating 【发布时间】:2016-06-10 20:23:43 【问题描述】:我在 UIViewController 中嵌入了一个 UIView。流程如下:
-
UIView 与父 UIVieController 一起加载
UIView 类以编程方式创建标签和其他图形
UIViewController 收到值已更新的通知
UIViewController 在 UIViews 类中运行一个函数
问题是 UIView 标签不会随着发送给它的值而更新。我已检查(请参阅打印行)并且正在接收正确的值。
// TemperatureUIView.swift
import UIKit
class TemperatureUIView: UIView
var tempLabel : UILabel!
override init(frame: CGRect)
super.init(frame: frame)
setup()
required init(coder: NSCoder)
super.init(coder: coder)!
setup()
func setup()
drawBaseCircle()
drawTempLabel()
func drawBaseCircle()
//Temperature Base Ring
let baseCircle = CAShapeLayer()
let baseCirclePath = UIBezierPath()
let baseCircleRadius :CGFloat = (self.frame.height/2)-10
baseCirclePath.addArcWithCenter(CGPoint(x: CGFloat(self.frame.width/2), y: CGFloat(self.frame.height/2)), radius: CGFloat(baseCircleRadius), startAngle: CGFloat(-M_PI_2), endAngle:CGFloat(M_PI_2*3), clockwise: true)
baseCircle.path = baseCirclePath.CGPath
baseCircle.fillColor = UIColor.clearColor().CGColor
baseCircle.strokeColor = UIColor.lightGrayColor().CGColor
baseCircle.lineWidth = 10.0
self.layer.addSublayer(baseCircle)
func drawTempLabel()
tempLabel = UILabel(frame: CGRect(origin: CGPoint(x: 0, y:0), size: CGSize(width: 40, height: 40)))
tempLabel.frame.origin = CGPoint(x: (self.frame.width / 2)-(tempLabel.frame.size.width/2), y: (self.frame.height / 2)-(tempLabel.frame.size.height/2))
tempLabel.font = UIFont.boldSystemFontOfSize(15.0)
tempLabel.textAlignment = NSTextAlignment.Center
tempLabel.textColor = UIColor.whiteColor()
tempLabel.tag = 101
tempLabel.layer.name = "temperatureDisplay"
self.addSubview(tempLabel)
self.bringSubviewToFront(tempLabel)
tempLabel.text = "---"
func setTemp(rawValue: NSData)
var buffer8LSB : UInt8 = 0
rawValue.getBytes(&buffer8LSB, range : NSMakeRange(5, 1))
if (self.viewWithTag(101) != nil )
tempLabel.text = ("\(String(format: "%.0f", Float(buffer8LSB)))")
print ("\(String(format: "%.0f", Float(buffer8LSB)))")
这是从父 UIViewController 调用的:
func eDataReceivedBLE(notification: NSNotification)
let characteristic = notification.userInfo!["characteristic"] as! CBCharacteristic
//let peripheral = notification.userInfo!["peripheral"] as! CBPeripheral
TemperatureUIView().setTemp(characteristic.value!)
UIViewController 中的通知是:
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(PluginMotionDataViewController.eDataReceivedBLE(_:)), name: "EdataReceived", object: nil)
任何想法或指导......
【问题讨论】:
【参考方案1】:每次收到通知时,您都会创建一个新视图,因为您调用的是TemperatureUIView().setTemp(characteristic.value!)
。 (()
初始化一个新实例,并且您正在调用类,而不是实例)。这个新实例没有被放置到您的视图层次结构中,所以旧的实例仍然存在,似乎什么也没发生。
您应该对现有视图有某种引用,然后致电existingTempView.setTemp(characteristic.value!)
。
顺便说一句,您最好避免实现init
函数,而是实现awakeFromNib
并在那里调用setup()
,因为在视图和视图控制器中使用init
会很快变得混乱。
【讨论】:
嗨,我现在明白这个问题了,谢谢。但我不明白解决方案。你能解释一下引用现有视图是什么意思吗? 当您放置 TemperatureUIView.setTemp(...) 时,它正在创建一个新的 UIView 对象,该对象被添加到主 VC 中。这就是问题所在。他对“现有视图”的引用是当您使用 TemperatureUIView 类的实例时,例如 existingTempView.setTemp(...)。它不再创建新视图,而是使用单个 UIView 对象,并从中更新信息。希望这有助于清除它 要添加到@user2277872,如果您需要更多指导,您需要展示您最初是如何以编程方式添加温度视图的。以上是关于在 UIView 中以编程方式创建的 UILabel 未更新的主要内容,如果未能解决你的问题,请参考以下文章
对子类 UIView 的约束会抛出以编程方式创建的 UILabel 位置
如何在 Swift 中以编程方式从 UIView 中删除安全区域?
未能尝试在 SWIFT 中以编程方式在滚动视图中添加 UIView 约束