在awakeFromNib中访问View?

fuz*_*oat 10 iphone cocoa-touch objective-c

我一直在尝试在awakeFromNib中设置UIImageView背景颜色(见下文)

[imageView setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:1.0]];
Run Code Online (Sandbox Code Playgroud)

当它不起作用时,我意识到它可能是因为视图尚未加载,我应该将颜色更改移动到viewDidLoad.

我可以证实我有这个权利吗?

加里

EDIT_002:

我刚开始一个新项目,从一个干净的开始检查这一点.我像往常一样设置视图.结果是控件确实在awakeFromNib中设置为(null).这是我有的:

码:

@interface iPhone_TEST_AwakeFromNibViewController : UIViewController {
    UILabel *myLabel;
    UIImageView *myView;
}
@property(nonatomic, retain)IBOutlet UILabel *myLabel;
@property(nonatomic, retain)IBOutlet UIImageView *myView;
@end
Run Code Online (Sandbox Code Playgroud)

.

@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];
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

awakeFromNib ...
myLabel: (null)
myView : (null)
viewDidLoad ...
myLabel: UILabel
myLabel: UIImageView
Run Code Online (Sandbox Code Playgroud)

我很想知道这是否应该起作用,从它看起来应该是的文档,但考虑到我通常设置的方式,我不能理解为什么它不在这种情况下.

zou*_*oul 29

还有一个答案:-)看起来你得到这种行为,因为控制器懒洋洋地加载视图.视图不会立即加载,它会在第一次有人调用view访问者时加载.因此,当您收到awakeFromNibNIB加载过程时,但不会查看视图中的对象.看到这段代码:

@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);
}
Run Code Online (Sandbox Code Playgroud)

这个日志:

#1: 0
#2: 0
#3: 1
Run Code Online (Sandbox Code Playgroud)

但是如果你强制加载视图:

- (void) awakeFromNib
{
    [super awakeFromNib];
    [self view]; // forces view load
    NSLog(@"#1: %i", !!foo);
}
Run Code Online (Sandbox Code Playgroud)

日志更改为:

#3: 1
#1: 1
Run Code Online (Sandbox Code Playgroud)