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)?
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    
}
                        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.
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:.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With