LondonGuy
LondonGuy

Reputation: 11098

How does NSBundle set pointers to view objects in instance variables when loading a nib file?

I'm working through a book and currently adding a view to a tables header programmatically. So I've setup the XIB file added a view resized it and added two subViews/UIButtons.

Interface file:

#import <Foundation/Foundation.h>

@interface ItemsViewController : UITableViewController
{
    IBOutlet UIView *headerView;
}

- (UIView *)headerView;
- (IBAction)addNewItem:(id)sender;
- (IBAction)toggleEditingMode:(id)sender;

@end

Part of my implementation:

- (UIView *)headerView
{
    // If we haven't got the headerView yet
    if (!headerView) {
        [[NSBundle mainBundle] loadNibNamed:@"HeaderView" owner:self options:nil];
    }
    return headerView;
}

In the Big Nerd book it states:

“The first time the headerView message is sent to the ItemsViewController, it will load HeaderView.xib and keep a pointer to the view object in the instance variable headerView.”

What I'd like to know is how is how it sets/keeps a pointer to the view object in the headerView instance variable?

I know the nib file is being is being loaded by passing it into the loadNibName parameter as a string but how is the pointer being set to the object in my headerView instance variable?

When I connect the file owner to headerView is that like creating an instance of UIView and storing it in the headerView instance variable programmatically?

I found it really hard to word the question but I hope it makes sense after reading this post.

Kind regards

Upvotes: 2

Views: 211

Answers (1)

Jonah
Jonah

Reputation: 17958

The -loadNibNamed:owner:options: method on NSBundle will read a nib file, instantiate the objects defined in it, and set any connections the nib file defines between those objects or between the loaded objects and the available proxy objects (like "File's Owner"). In this case you are passing self (the current ItemsViewController instance) as the owner argument. That ItemsViewController will then be the "File's Owner" when objects are loaded from this nib file.

If you look at the nib in Xcode you should see that one of the UIViews defined in that nib is connected to the headerView outlet of the "File's Owner". As a result when the nib is loaded it will attempt to set that headerView ivar to reference the loaded UIView object.

When I connect the file owner to headerView is that like creating an instance of UIView and storing it in the headerView instance variable programmatically?

Yes, this is equivalent to creating the view programmatically and setting the ivar yourself. You could write a method to create views on demand instead of using a nib as a factory for view objects if you prefer. Nibs are handy because they can allow you to configure view properties in a visual editor which may be easier to adjust than setting those properties progammatically. Nibs also offer a way to loosely couple the source of your view instances to the controller using those views which is convenient when you might want to switch which view your controller uses (iPad vs iPhone view, or different views for different locales).

Upvotes: 2

Related Questions