如何刷新/重新加载/重新渲染/重新 - ' init'一个子类UIView?

时间:2015-09-08 09:40:49

标签: ios swift uiview

我有一个名为IncidentHeaderView的UIView的子类,我在父视图中显示它(它实际上是在通过TabBarController导航的一堆父视图中重复使用的)。

IncidentHeaderView从NSUserDefaults获取几个值并将其显示为标签。它在应用程序启动时完美运行,并显示正确的信息。当NSUserDefaults中的值在运行时更改时,问题就开始了,我需要IncidentHeaderView来反映这些更改。

这是我的子类UIView,IncidentHeaderView,它也有一个简单的.xib用于布局:

import Foundation
import UIKit

class IncidentHeaderView: UIView {

    @IBOutlet var incidentHeaderContentView: UIView!

    @IBOutlet weak var incidentNameLabel: UILabel!
    @IBOutlet weak var incidentDateLabel: UILabel!

    var defaults = NSUserDefaults.standardUserDefaults()

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.commonInit()
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    private func commonInit() {

        println("incident header common init")

        NSBundle.mainBundle().loadNibNamed("IncidentHeader", owner: self, options: nil)
        incidentHeaderContentView.frame = self.bounds
        incidentHeaderContentView.autoresizingMask = .FlexibleHeight | .FlexibleWidth
        self.addSubview(incidentHeaderContentView)

        if let var activeIncidentName = defaults.stringForKey("activeIncidentName") {
            incidentNameLabel.text = activeIncidentName.uppercaseString
        }

        if let var activeIncidentDate: AnyObject = defaults.stringForKey("activeIncidentDate") {
            incidentDateLabel.text = activeIncidentDate.uppercaseString
        }

    }

}

好的,因此NSUserDefaults中的值可以从应用程序内的其他位置更改。

最常见的示例是我从显示IncidentHeaderView的父视图中弹出一个模态,在此模式中,我更改了相关NSUserDefaults的值。当我解除模态时,我希望IncidentHeaderView重新渲染,以便它显示来自NSUserDefaults的新标签值。

我如何以最有效/最有效的方式做到这一点?

我尝试在IncidentHeaderView上调用setNeedsDisplay()。我试过发布和观察通知。没有骰子。

我唯一成功的尝试就是从IncidentHeaderView中删除一堆初始化内容并在父视图的viewWillAppear方法中调用它,但这看起来真的很笨拙而不是什么我想到了。在我的脑海中,我想将此功能保留在子类UIView中:

 func updateIncidentHeaderView(incidentHeaderView: IncidentHeaderView) {

     if let var activeIncidentName = defaults.stringForKey("activeIncidentName") {
         incidentHeaderView.incidentNameLabel.text =  activeIncidentName.uppercaseString
     }

    if let var activeIncidentDate: AnyObject = defaults.stringForKey("activeIncidentDate") {
         incidentHeaderView.incidentDateLabel.text = activeIncidentDate.uppercaseString
     }
 }

那么,有人能指出我在父视图中重新渲染/重新启动子视图的正确方向吗?

感谢。

0 个答案:

没有答案