How to create view from a nib file in xcode?

大憨熊 提交于 2019-12-04 19:34:22


I have the following code to create a view and put it in scrollview to allow paging
the code works fine however what I couldn't do is loading views from a nib file

in other words I want to use "initWithNibName" instead of "initWithFrame"?

   - (void)createPageWithColor:(UIColor *)color forPage:(int)page
     UIView *newView = [[UIView alloc] initWithFrame:CGRectMake(0, 300,400)];
         newView.backgroundColor = color;
     [scrollView addSubview:newView];

Thanks alot


I think the thing you're missing is that you can set the frame of your new UIView after loading the nib. Load/Init time isn't your only shot at that. I'm also breaking the load function into its pieces, in the code below, so you can see more easily what's going on.


NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"yournib" 
//I'm assuming here that your nib's top level contains only the view 
//you want, so it's the only item in the array.
UIView *myView = [nibContents objectAtIndex:0];
myView.frame = CGRectMake(0,0,300,400); //or whatever coordinates you need
[scrollview addSubview:myView];

Don't forget that for that UIScrollView to actually scroll, you need to set its contentSize property to the size of the goods inside it, which is likely bigger than the .frame property of the scroll view itself.


I know this is an old post, but I wanted to create a UIView as a separate file and add a xib so I could use it in several places in my app (almost like using it as a custom table view cell). And I couldn't get it quite right, but this post helped me get to the result I wanted.

So just if anyone wants to do it the same way, this is what I did:

Add this to the initialization code in your UIView's .m file:

- (id)initWithFrame:(CGRect)frame
    self = [NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil][0];
    if (self)
        self.frame = frame;
    return self;

Then in interface builder/xib editor you have to assign the class you created for the UIView so you can add IBOutlets.

Hope it helps someone out, cuz it took me a bit!


Try something like this (adapted from "The iPhone Developers Cookbook", pg. 174):

UIView *newView = [[[NSBundle mainBundle] loadNibNamed:@"yournib" owner:self options:nil] lastObject];

This assumes a single view object in your .xib, but you could modify it if your .xib is more complicated.


You can use my simple class to create view from nib file with one method call.
For example, you can use KRNNib in a next way:

UIView *view = [KRNNib viewFromNibWithName:@"TestView"];
[self.view addSubview:view]; // add instantiated view as subview to view of current UIViewController