I have a custom UIView
(MyCustomUIView
) which is built using Interface Builder. I'd like to place this custom view in MyViewController
's view, which is also designed using IB. I've placed an UIView
as a subview in MyViewController
's XIB and set it's class to MyCustomUIView
. The problem is, when I run the code, only a blank view appears. (When I instantiate MyCustomUIView
in code, it displays well.)
I'm only overriding the initWithFrame:
method the following way in MyCustomUIView.m
:
- (id)initWithFrame:(CGRect)frame
{
[[NSBundle mainBundle] loadNibNamed:@"MyCustomUIView" owner:self options:nil];
self = self.view;
return self;
}
What should I do to make the view load properly? How should initWithCoder:
look like?
Do not put anything in the view part of the view controller in IB. Instead, set the nib name for the view controller in IB to the name of the nib containing the view. In the nib containing the view, set the file's owner to the view controller class and hook up its
view
property to the view.The result will be that when the view controller is instantiated, if it is instantiated from the nib (which you have not proved is what's really going to happen, but let's just say it is), it will find the nib and load the view from it.
Basically the rule is that it makes no difference where a view controller comes from, it will go through the same steps looking for its view in the same order, as I explain in my book:
http://www.apeth.com/iOSBook/ch19.html#_view_controller_and_view_creation
and in this webcast:
http://www.youtube.com/watch?v=zIufcKpDIRo
You are correct. IB uses initWithCoder. initWithCoder should look very similar to your other init methods:
Once you assign your class within IB, you won't need to instantiate it from the bundle unless I'm misunderstanding your intention.