访问IBOutlet时遇到问题。
我有一个NIB,里面有一个tableview,一个工具栏和一个UILabel(封装在一个视图中)。 控制器(即文件的所有者)定义为:
@interface ChoixPeriodeController : UIViewController <UITableViewDelegate> {
IBOutlet UILabel* __periodeInitialeLabel;
}
@property(nonatomic, retain) UILabel* periodeInitialeLabel;
- (void) setSelectedPeriode:(Tache_TypePeriode)typePeriode;
@synthetize periodeInitialeLabel = __periodeInitialeLabel;
在.m文件中,父窗口调用此函数来初始化Label:
- (void) setSelectedPeriode:(Tache_TypePeriode)typePeriode {
NSMutableString* tmpString = [NSMutableString string];
[tmpString appendFormat:some text format....];
self.periodeInitialeLabel.text = tmpString;
}
在这个函数中,我可以看到self.periodeInitialeLabel为零。我不明白为什么。一切都与IB相关联......你知道会出现什么问题吗?
答案 0 :(得分:5)
这里的问题是操作顺序。如果文本标签仍为零,则可能尚未设置。相反,您可以在UIViewController方法viewDidLoad
内调用此方法来处理这样的操作,这些操作必须执行在Interface Builder中无法完成的“额外配置”。
还有awakeFromNib
。它们非常相似,只是在解压缩NIB文件时,awakeFromNib被称为 ONCE 。 viewDidLoad
可以被多次调用 - 例如,如果内存不足(通常在iOS4上发生),您的视图将通过viewDidUnload
清除。
答案 1 :(得分:4)
对于仍然遇到此问题的人,即使在示例应用中,我也面临类似的问题。答案结果是这样的:
UIImageView Created In Interface Builder Set To nil When Needed
[self memberVar]
加载属性,同时:
self.memberVar
只需访问当前值,该值将保持为零。所以我试图摆脱使用“。”运营商。这是一个非常微妙的问题,我最近在很多示例代码中看到过。新例子中的下划线方法:
@synthesize memberVar = _memberVar;
仍然只是将成员变量保留为nil,直到您使用[self memberVar]
访问它。我认为Apple可能会尝试通过在实现中引用_memberVar来避免此问题(例如在dealloc
中使用[_imageView release]
)
更新另外,如果您正在使用initWithNibName
或loadNibNamed
动态加载nib或xib中的控制器(例如自定义UITableViewCell
}),别忘了打电话:
[self loadView];
这也会加载成员变量。除非显示视图或pushViewController
navigationController
,否则不会自动加载它们。
答案 2 :(得分:0)
我认为您的财产也必须与IBOutlet一起定义,例如:
@property(nonatomic, retain) IBOutlet UILabel* periodeInitialeLabel;
你需要@synthesize
你的实现文件中的属性,然后确保periodeInitialeLabel
在IB中正确连接(即不是`__periodeInitialeLabel');
<强>更新强>
如果您的syntize语句如下所示:
@synthesize periodeInitialeLabel;
那可能是你的问题。我认为必须是这样的:
@synthesize periodeInitialeLabel = __periodeInitialeLabel;
将它连接到你的领域。
答案 3 :(得分:0)
鉴于此界面:
@interface ChoixPeriodeController : UIViewController <UITableViewDelegate> {
UILabel* __periodeInitialeLabel;
}
// I think it's more appropriate to mark a property with IBOutlet,
// rather than an ivar
@property(nonatomic, retain) IBOutlet UILabel* periodeInitialeLabel;
- (void) setSelectedPeriode:(Tache_TypePeriode)typePeriode;
// ...
@end
它的实现应该如下所示:
@implementation ChoixPeriodeController
@synthesize
periodeInitialeLabel = __periodeInitialeLabel;
// the rest of your implementation goes here
// ...
@end
我还建议您查看Google Objective-C Style Guide。用两个前导下划线命名你的ivars可能不是最好的选择。