我有一个问题访问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.

其他提示

任何人仍然有这个问题,我是面临类似的东西甚至在一个样本应用程序。答案竟然是这样的:

UIImageView创建的接口建设者设置为零,需要时

[self memberVar]

载荷的财产,而:

self.memberVar

只要访问的当前价值,这将仍然是零。所以我试图摆脱使用"."操作者。这是一个非常微妙的问题,我已经看到在很多样的代码最近。下划线方法在较新的例子:

@synthesize memberVar = _memberVar;

仍然刚刚离开的成员的变量为零,直到您访问它 [self memberVar].我认为苹果公司可能试图避免的问题通过参照_memberVar的执行情况(例如在 dealloc[_imageView release] )


更新: 此外,如果您使用 initWithNibNameloadNibNamed 向载荷控制器从一笔尖或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导风格.命名你的实例变量与两个领先的强调可能不是最好的选择。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top