Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

confused about initWithCoder and custom UIViews

Tags:

ios

ios6

I'm trying to create a custom UIView that brings in it's view from a nib file.

In my controller I have something like:

self.arcView=[[JtView alloc] initWithCoder:self];
self.arcView.backgroundColor=[UIColor redColor];
self.arcView.frame=CGRectMake(30.0f,200.0f, 100.0f, 100.0f);
[self.view addSubview:self.arcView];

My first question is what should go into the argument for initWithCoder (NSCoder *)? I tried self but got an incompatible pointer type but this seemed to work. But on to question #2:

Second, the argument is that you use initWithCoder with nibs and initWithFrame when putting your custom view in a frame. Well, I want to load a nib in my custom view and then put it into a frame. Can I just add a frame as above and it's ok (it looks like it works)?

like image 967
timpone Avatar asked Mar 01 '13 03:03

timpone


4 Answers

initWithCoder is called much before init and viewDidLoad methods. And you never call it. It gets called as you load a nib file from your mainBundle.

However, It receives NSCoder as an argument. Check how it is called in a class:

- (id)initWithCoder:(NSCoder *)aDecoder {
    if ((self = [super initWithCoder:aDecoder])) {
        [self baseClassInit];
    }
    return self;
}

- (void)baseClassInit {

    //initialize all ivars and properties    
}
like image 158
Anoop Vaidya Avatar answered Nov 06 '22 06:11

Anoop Vaidya


You are doing it the other way around: it's not you who should call initWithCoder:, it's the implementation of the loadNibNamed:owner: method that does it.

What you need to do in your code is calling

UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"theNIB" 
                                              owner:self 
                                            options:nil] objectAtIndex:0];

This would unbundle the NIB, and call your initWithCoder: initializer, and give you back a view with all the outlets connected.

like image 45
Sergey Kalinichenko Avatar answered Nov 06 '22 06:11

Sergey Kalinichenko


self.arcView = [[[NSBundle mainBundle] loadNibNamed:@"JtView" owner:self options:nil] objectAtIndex:0];
self.arcView.frame = CGRectMake(30.0f,200.0f, 100.0f, 100.0f);
self.arcView.backgroundColor = [UIColor redColor];
[self.view addSubview:self.arcView];

That will work and don't call initWithCoder:.

like image 1
Bzmario Avatar answered Nov 06 '22 06:11

Bzmario


Never call initWithCoder explicitly, it gets call implicitly while unarchiving archived object and initialise object ivars and properties- Archive object can be your custom model class saved in persistence storage or a custom view loaded from xib file.

In your class it's look like you are trying to create a custom view, so load it from xib file, for reference @dasblinkenlight code is a perfect solution.

like image 1
RAJNISH TOMAR Avatar answered Nov 06 '22 05:11

RAJNISH TOMAR