iPhone - 无法访问IBOutlet(零值)

时间:2011-01-15 12:45:01

标签: iphone interface-builder uilabel null iboutlet

访问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相关联......你知道会出现什么问题吗?

4 个答案:

答案 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]


更新另外,如果您正在使用initWithNibNameloadNibNamed动态加载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可能不是最好的选择。