Alex Rivera | Logout

Accessing View in awakeFromNib?

Asked 2010-04-27T16:31:51.350
13

I have been trying to set a UIImageView background color (see below) in awakeFromNib

[imageView setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:1.0]];

When it did not work, I realised that its probably because the view has not loaded yet and I should move the color change to viewDidLoad.

Can I just verify that I have this right?

gary

EDIT_002:

I have just started a fresh project to check this from a clean start. I setup the view the same as I always do. The results are that the controls are indeed set to (null) in the awakeFromNib. Here is what I have:

CODE:

@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];
}

OUTPUT:

awakeFromNib ...
myLabel: (null)
myView : (null)
viewDidLoad ...
myLabel: UILabel
myLabel: UIImageView

I would be interested to know if this should work, from the docs it looks like it should, but given the way I usually set things up I can't quite understand why it does not in this case.

Edit
Report

1 Answer

-2

Are you sure the objects are not nil? NSAssert or NSParameterAssert are your friends:

-(void) awakeFromNib {
    NSParameterAssert(imageView);
    NSParameterAssert(testLabel);
    NSLog(@"awakeFromNib ...");
    [imageView setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:1.0]];
    [testLabel setText:@"Pants ..."];
    [super awakeFromNib];
}

If the objects are really initialized, try to log their address and make sure that the instances that appear in viewDidLoad are the same as those in awakeFromNib:

- (void) awakeFromNib {
    NSLog(@"test label #1: %@", testLabel);
}

- (void) viewDidLoad {
    NSLog(@"test label #2: %@", testLabel);
}

If the numbers are the same, you can create a category to set a breakpoint on setBackgroundColor and peek in the stack trace to see what’s going on:

@implementation UIImageView (Patch)
- (void) setBackgroundColor: (UIColor*) whatever {
    NSLog(@"Set a breakpoint here.");
}
@end

You can do the same trick using a custom subclass:

@interface PeekingView : UIImageView {}
@end

@implementation PeekingView
- (void) setBackgroundColor: (UIColor*) whatever {
    NSLog(@"Set a breakpoint here.");
    [super setBackgroundColor:whatever];
}
@end

Now you’ll set your UIViewObject to be of class PeekingView in the Interface Builder and you’ll know when anybody tries to set the background. This should catch the case where somebody overwrites the background changes after you initialize the view in awakeFromNib.

But I presume that the problem will be much more simple, ie. imageView is most probably nil.

answered 2010-04-27T17:48:54.620

Your Answer