我一直在尝试在 awakeFromNib 中设置 UIImageView 背景颜色(见下文)
[imageView setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:1.0]];
当它不起作用时,我意识到可能是因为 View 尚未加载,我应该将颜色更改移动到 viewDidLoad。
我可以验证我是否有这个权利吗?
加里
EDIT_002:
我刚刚开始了一个新项目来从头开始检查这个。我像往常一样设置 View 。结果是控件确实在 awakeFromNib 中设置为 (null)。这是我所拥有的:
代码:
@interface iPhone_TEST_AwakeFromNibViewController : UIViewController {
UILabel *myLabel;
UIImageView *myView;
}
@property(nonatomic, retain)IBOutlet UILabel *myLabel;
@property(nonatomic, retain)IBOutlet UIImageView *myView;
@end
.
@synthesize myLabel;
@synthesize myView;
-(void)awakeFromNib {
NSLog(@"awakeFromNib ...");
NSLog(@"myLabel: %@", [myLabel class]);
NSLog(@"myView : %@", [myView class]);
//[myLabel setText:@"AWAKE"];
[super awakeFromNib];
}
-(void)viewDidLoad {
NSLog(@"viewDidLoad ...");
NSLog(@"myLabel: %@", [myLabel class]);
NSLog(@"myView : %@", [myView class]);
//[myLabel setText:@"VIEW"];
[super viewDidLoad];
}
输出:
awakeFromNib ...
myLabel: (null)
myView : (null)
viewDidLoad ...
myLabel: UILabel
myLabel: UIImageView
我很想知道这是否可行,从文档看来应该可行,但考虑到我通常设置的方式,我不太明白为什么在这种情况下不行。
最佳答案
还有一个答案 :-) 看起来您会出现这种行为,因为 Controller 延迟加载 View 。 View 不会立即加载,它会在有人第一次调用 view
访问器时加载。因此,当您收到 awakeFromNib
时,NIB 加载过程已完成,但不是针对您 View 中的对象。看这段代码:
@property(retain) IBOutlet UILabel *foo;
@synthesize foo;
- (void) awakeFromNib
{
NSLog(@"#1: %i", !!foo);
[super awakeFromNib];
NSLog(@"#2: %i", !!foo);
}
- (void) viewDidLoad
{
NSLog(@"#3: %i", !!foo);
}
这个日志:
#1: 0
#2: 0
#3: 1
但是如果你强制加载 View :
- (void) awakeFromNib
{
NSLog(@"#1: %i", !!foo);
[super awakeFromNib];
[self view]; // forces view load
NSLog(@"#2: %i", !!foo);
}
日志变成这样:
#1: 0
#3: 1
#2: 1
关于iphone - 在 awakeFromNib 中访问 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2723042/