我有一个名为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
}
}
那么,有人能指出我在父视图中重新渲染/重新启动子视图的正确方向吗?
感谢。