3

我在访问 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 为 nil。我不明白为什么。一切都连接到 IB... 你看到可能是什么问题了吗?

4

4 回答 4

5

这里的问题是操作的顺序。如果文本标签仍为 nil,则可能尚未设置。相反,您可以在 UIViewController 方法中调用此方法viewDidLoad来处理这样的操作,这些操作必须执行在 Interface Builder 中无法完成的“额外配置”。

还有awakeFromNib. 它们非常相似,只是 awakeFromNib在 NIB 文件解包时 调用一次。viewDidLoad可以多次调用 - 例如,如果内存不足的情况(通常发生在 iOS4 上),您的视图将通过viewDidUnload.

于 2011-01-16T01:32:31.670 回答
4

对于仍然遇到此问题的任何人,即使在示例应用程序中,我也面临类似的问题。答案原来是这样的:

需要时在 Interface Builder 中创建的 UIImageView 设置为 nil

[self memberVar]

加载属性,同时:

self.memberVar

只访问当前值,该值将保持为零。所以我试图摆脱使用“。” 操作员。这是我最近在很多示例代码中看到的一个非常微妙的问题。较新示例中的下划线方法:

@synthesize memberVar = _memberVar;

仍然只是保留成员变量 nil ,直到您使用[self memberVar]. 我认为 Apple 可能试图通过在实现中引用 _memberVar 来避免这个问题(例如在deallocwith 中[_imageView release]


更新:此外,如果您正在使用initWithNibNameloadNibNamed从 nib 或 xib 动态加载控制器(例如 custom UITableViewCell),请不要忘记调用:

[self loadView];

这也会加载成员变量。它们不会自动加载,除非视图显示或执行pushViewControllernavigationController.

于 2012-02-25T01:33:20.973 回答
0

我认为您的属性也必须使用 IBOutlet 定义,例如:

@property(nonatomic, retain) IBOutlet UILabel* periodeInitialeLabel; 

并且您需要@synthesize在您的实现文件中设置该属性,然后确保periodeInitialeLabel在 IB 中正确连接(即不是 `__periodeInitialeLabel');

更新:

如果您的综合语句如下所示:

@synthesize periodeInitialeLabel;

那么这可能是你的问题。我认为它必须是这样的:

@synthesize periodeInitialeLabel = __periodeInitialeLabel;

把它连接到你的领域。

于 2011-01-15T12:52:01.710 回答
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 可能不是最佳选择。

于 2011-01-15T13:14:27.683 回答