iPhone--不能访问的一个IBOutlet(无价值)
-
11-10-2019 - |
题
我有一个问题访问IBOutlet.
我有一个尖里面是提供一个工具栏和一个UILabel(封装成一个图)。控制器(这是该文件的所有者)被定义为:
@interface ChoixPeriodeController : UIViewController <UITableViewDelegate> {
IBOutlet UILabel* __periodeInitialeLabel;
}
@property(nonatomic, retain) UILabel* periodeInitialeLabel;
- (void) setSelectedPeriode:(Tache_TypePeriode)typePeriode;
与 @synthetize periodeInitialeLabel = __periodeInitialeLabel;
中。m文件,这一功能是所谓的父窗口init标签:
- (void) setSelectedPeriode:(Tache_TypePeriode)typePeriode {
NSMutableString* tmpString = [NSMutableString string];
[tmpString appendFormat:some text format....];
self.periodeInitialeLabel.text = tmpString;
}
这个功能,我可以看到,自我。periodeInitialeLabel是至为零。我不能看为什么。一切都连接到IB...你看到什么问题?
解决方案
这里的问题是操作的顺序。如果文本的标签仍然是零,很可能没有设置起来。相反,你可以叫这个方法的内部UIViewController的方法 viewDidLoad
处理操作,如此,必须做"额外的结构"不能完成在接口的建设者。
还有 awakeFromNib
.他们都非常相似,只是awakeFromNib被称为 一旦 当尖文件未包装的. viewDidLoad
可以被称为许多倍,例如,如果有一个内存不足的情况(通常发生在ios系统4),你的意见将被清除过 viewDidUnload
.
其他提示
任何人仍然有这个问题,我是面临类似的东西甚至在一个样本应用程序。答案竟然是这样的:
[self memberVar]
载荷的财产,而:
self.memberVar
只要访问的当前价值,这将仍然是零。所以我试图摆脱使用"."操作者。这是一个非常微妙的问题,我已经看到在很多样的代码最近。下划线方法在较新的例子:
@synthesize memberVar = _memberVar;
仍然刚刚离开的成员的变量为零,直到您访问它 [self memberVar]
.我认为苹果公司可能试图避免的问题通过参照_memberVar的执行情况(例如在 dealloc
与 [_imageView release]
)
更新: 此外,如果您使用 initWithNibName
或 loadNibNamed
向载荷控制器从一笔尖或xib在飞行(例如一个自定义 UITableViewCell
),别忘了呼吁:
[self loadView];
这也负载部件的变量。他们不是自动加载,除非该图所示的或不会 pushViewController
到一个 navigationController
.
我想你的属性已被定义与IBOutlet以及,如:
@property(nonatomic, retain) IBOutlet UILabel* periodeInitialeLabel;
和你需要 @synthesize
酒店在你执行情况的文件,并确保 periodeInitialeLabel
是否正确,在IB(即不`__periodeInitialeLabel');
更新:
如果你的综合声明是这样的:
@synthesize periodeInitialeLabel;
然后这可能是你的问题。我认为这已经是这样的:
@synthesize periodeInitialeLabel = __periodeInitialeLabel;
把它连到你的领域。
鉴于这种接口:
@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
我也建议你看看 谷歌的目标-C导风格.命名你的实例变量与两个领先的强调可能不是最好的选择。