How to create view from a nib file in xcode?

19,135

Solution 1

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.

Observe:

NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"yournib" 
                                                     owner:self 
                                                   options:nil];
//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.

Solution 2

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!

Solution 3

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.

Share:
19,135

Related videos on Youtube

ahmed
Author by

ahmed

Updated on April 25, 2022

Comments

  • ahmed
    ahmed about 2 years

    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

  • ahmed
    ahmed almost 14 years
    Great John, but I need to specify the position of the newView because I am adding it to a scrollview
  • Dan Ray
    Dan Ray almost 14 years
    Commented about something @John N missed but I missed that he HADN'T missed it. So never mind!
  • ahmed
    ahmed almost 14 years
    Thats what I am talking about :) Thank you Dan, your solution works perfectly, yes I have changed the positions of the views on the scrollview with something like "scrollView.frame.size.width * page" for the x coordinator Thanks again, you made my day :)
  • Scott Berrevoets
    Scott Berrevoets over 11 years
    No need to make a new CGRect, you can simply do self.frame = frame
  • bbrame
    bbrame almost 11 years
    Fantastic! Great solution!