我有一个UIViewController
,当它收到一个属性的新(对象)值时,需要设置几个标签:
-(void)setCurrentEvent:(Event *)e {
[currentEvent release];
currentEvent = [e retain];
self.dateLabel.text = currentEvent.subtitle;
self.summaryTextView.text = currentEvent.summary;
self.avgRatingLabel.text = [NSString stringWithFormat:@"%.1f",currentEvent.avgRating];
[self setTitle:currentEvent.title];
[self.view setNeedsDisplay];
}
我发现当第一次设置值时,标签和文本视图对象尚未初始化,因此未设置其新值。在setCurrentEvent
的初始调用完成之后一切顺利,但我认为我在这里依赖于延迟加载太多了?
答案 0 :(得分:1)
假设它正从一个笔尖中唤醒或从一个笔尖中加载:
在调用视图控制器的viewDidLoad
方法之前,无法保证您的任何IBOutlet都已设置。
您所看到的我怀疑是第一次设置值时您的视图尚未加载,并且在第二次设置值时,它们具有。
您应该延迟处理,直到加载视图,或者根据需要自己创建视图。
修改强>
根据您的评论,您似乎是从笔尖加载。在这种情况下,我可能会保留实例变量(currentEvent
说),然后调用类似updateUI
的方法来正确设置属性。然后我还将updateUI
放在viewDidLoad中,这样当标签可用时,它们会针对当前事件进行更新。
答案 1 :(得分:0)
很好(好)非常懒,但是如果你没有按需设置init,那么你需要注意初始化顺序。我通常做的就是这样的事情
- (UILabel) dateLabel {
if (!dateLabel) {
dateLabel = [[UILabel alloc] initWithFrame:FRAME_POSITION];
}
return dateLabel;
}
通过这种方式,您可以确定在访问字段时初始化该字段,因为访问器是惰性初始化程序。你需要注意递归依赖关系,但我已经将它用于大型复杂的初始化链。