以编程方式在UIView内创建UILabel而不更新

时间:2016-06-10 20:23:44

标签: ios swift uiview uiviewcontroller uilabel

我在UIViewController中嵌入了一个UIView。过程如下:

  1. UIView使用父UIVieController加载
  2. UIView类以编程方式创建标签和其他图形
  3. UIViewController收到一条值已更新的通知
  4. UIViewController在UIViews类中运行一个函数
  5. 问题是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 个答案:

答案 0 :(得分:2)

每次收到通知时,您都会创建一个新视图,因为您正在调用TemperatureUIView().setTemp(characteristic.value!)。 (()初始化一个新实例,并且您正在调用该类,而不是实例。这个新实例没有被放置到你的视图层次结构中,因此旧的实例只是保留,并且看起来根本没有发生任何事情。

您应该在现有视图中添加某种类型的引用,然后调用existingTempView.setTemp(characteristic.value!)

顺便说一句,您可能最好避免实施init函数,而是实现awakeFromNib并在那里调用setup(),就像在视图中使用init一样视图控制器可能会非常快速地混淆。