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