Reputation: 7058
I have created custom UIView
with a xib.
In addition I have a UIViewController
in my storyboard, to which I have added a UIView
and set its class to be my custom UIView
.
But when I am running the app, the view doesn't have its subviews. When I debug, all the subviews are null.
In .m of the custom UIView
, these init methods are present:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
}
return self;
}
What am I missing?
Upvotes: 22
Views: 24659
Reputation: 20234
As you already know, with a UIViewController
we have the -initWithNibName:bundle:
method to connect it with an xib.
But...
When it comes to a UIView
, you need to use -loadNibNamed:owner:options:
and load it with the xib. (simply specifying a custom class to the view in the xib won't work)
UIView
subclass called CustomXIBView
UIView
)CustomXIBView
CustomXIBView
's nibView
(left toolbar)Show Identity Inspector
(3rd option in the panel on the right)CustomXIBView
as the Custom Class of the View
CustomXIBView
's File's Owner
in the nibCustomXIBView.h
//To load `CustomXIBView` from any `UIViewController` or other class:
//instead of the following commented code, do the uncommented code
//CustomXIBView *myCustomXIBViewObj = [CustomXIBView alloc] init];
//[myCustomXIBViewObj setFrame:CGRectMake(0,0,320,480)];
//Do this:
CustomXIBView *myCustomXIBViewObj =
[[[NSBundle mainBundle] loadNibNamed:@"someView"
owner:self
options:nil]
objectAtIndex:0];
[myCustomXIBViewObj setFrame:CGRect(0,
0,
myCustomXIBViewObj.frame.size.width,
myCustomXIBViewObj.frame.size.height)];
[self.view addSubview:myCustomXIBViewObj];
ref: http://eppz.eu/blog/uiview-from-xib/
Upvotes: 33