简体   繁体   中英

Custom UIView added in the interface builder does not load the xib

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?

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 )


Suppose:

  1. Created a UIView subclass called CustomXIBView
    • ( New File > Cocoa Touch > Objective-C Class -- Subclass of UIView )
  2. Created a Simple View User Interface and named it CustomXIBView
    • ( New File > User Interface > View )

Steps:

  1. Go to CustomXIBView 's nib
  2. Select View ( left toolbar )
  3. Select Show Identity Inspector ( 3rd option in the panel on the right )
  4. Specify CustomXIBView as the Custom Class of the View
    • don't do anything with CustomXIBView 's File's Owner in the nib
  5. Drag Drop Objects and connect it with CustomXIBView.h

Code:

//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/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM