views:

63

answers:

1

I have a View Controller that is swapping UIView objects in and out. There is the potential to have hundreds of different views, each with their own behaviors.

Within my current MainWindow.xib file I currently have:

File's Owner     UIApplication
First Responder  UIResponder
AppDelegate      AppDelegate
  -Cover         Cover
Window           UIWindow
Table of Contents  TableOfContents
page1            Page1
page2            Page2
page...n         Page...n

The AppDelegate declares the window and the viewController. It's pretty basic.

MainViewController.h

#import <UIKit/UIKit.h>


@class TableOfContents, Page1;

@interface MainViewController : UIViewController {

    TableOfContents *tableOfContents;
    Page1 *page1;
    Page2 *page2;
    Page...n *page...n;
}

@property (nonatomic, retain) IBOutlet TableOfContents *tableOfContents;
@property (nonatomic, retain) IBOutlet Page1             *page1;
@property (nonatomic, retain) IBOutlet Page2             *page2;
@property (nonatomic, retain) IBOutlet Page...n          *page...n;

-(IBAction)funcGoToPage:(id)sender;

@end

MainViewController.m

#import "MainViewController.h"
#import "TableOfContents.h"
#import "Cover.h"
#import "Page1.h"
#import "Page2.h"
#import "Page...n.h"

@implementation MainViewController

@synthesize page1, page2, page...n tableOfContents;
@synthesize pageID, pagesPathFile, pagesPath;


-(IBAction)funcGoToPage:(id)sender{

    //[[self view] removeFromSuperview];
    [self.view addSubview:self.tableOfContents];
}

The corresponding UIView classes are pretty bare at the moment so I'll refrain from posting them.

Right now funcGoToPage is just bringing up tableOfContents. Eventually I'll have it go different places depending on what was clicked.

Currently each page is set up as an IBOutlet and linked from the MainViewController to the appropriate UIView in Interface Builder. Done this way each page will have to be set up as a variable and linked to in IB creating a hubub of variables, outlets and connections.

My question is: Is there a way to create these connections on the fly so that I can swap them in using my funcGoToPage function without setting them up as an IBOutlet?

+4  A: 

When a nib is loaded all of its content is loaded. If you have lots of views in one nib you'll quickly run out of memory.

I would put each page in a seperate nib and then load the nib when required: [[NSBundle mainBundle] loadNibNamed:@"nibNameWithoutExtension" owner:self options:nil];

For this to work:

  • add an IBOutlet, eg newPage, to whatever self refers to
  • set the File Owner in nibNameWithoutExtension to whatever self refers to
  • join the view in nibNameWithoutExtension to the newPage outlet of File Owner
Benedict Cohen
When the nib is loaded does it also load all the images and objects referenced within it's various UIViews? Like if each View contained a high quality image would all of those images but loaded into the memory at once?
emachine
Yes, anything a nib references is loaded when you instantiate the nib.
Kendall Helmstetter Gelner
Interesting, I'm taking your advise and switching to separate nibs. Thank you.
emachine
Not all images have to be loaded. UIImage is supposed to be unloadable when memory is scarce provided it was loaded from a file (so it can save the path). I'm also pretty sure that PNG/JPEG decompression happens lazily. However, simply instantiating a lot of views from a nib is slooooooooow.
tc.