Where is MainWindow.xib in Xcode 4.2 ?

In Xcode 4.2 the MainWindow.xib is not included for some of the project templates. Its means now we have to generate GUI elements by code or we can reconstruct the MainWindow.xib in project. I am describing you the second option here.

If you create a new project in XCode 4.2, and choose the Empty Application template to start from, change nothing and try running it in your iPhone 5.0 simulator, you will see an empty – black – screen. The only thing you get from the template is an AppDelegate.h and AppDelegate.m.

We’ll now reconstruct the MainWindow.xib file in our project. So the next thing is now to create a empty user interface file. Choose iOS > User Interface > Empty as template. The name of this file is not very important but we’ll use MainWindow.xib because this name is familiar to us.

Now select the Empty MainWindow.xib file we just created in previous step.

Change the Class of File’s Owner to UIApplication

Now drop a Object from Library to Objects in xib file.

Change the class of that object to the AppDelegate class

sd

Now add a window to objects pane.

Now we need to bind this window object to our code. To do this we have to add IBOutlet to window object in AppDelegate.h file. You code of AppDelegate.h should look like this –
</pre>
#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) IBOutlet UIWindow *window;

@end

Note the IBOutlet just before UIWindow.

Now continue with editing MainWindow.xib file –

Control-Drag from the delegate outlet of the File Owner to the xAppDelegate object.

Control-Drag from the window outlet of the xAppDelegate to the Window.

Navigate to the project, and in the Summary tab, select MainWindow as the Main Interface.

We are almost done now..  But there is one more thing we need to fix. In AppDelegate.m, there was actually code that creates a window as well, so we have to delete this code.

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

We are done now

25 thoughts on “Where is MainWindow.xib in Xcode 4.2 ?”

  1. This all worked great until the third from last step – “Control-drag from the window outlet of the xAppDelegate to the Window.”
    When I get to this step, there are no outlets listed. Is there something I have to do to make the window outlet known here? I added IBOutlet to the .h file as instructed two steps prior (and saved the file), but that doesn’t seem to have been enough.

    1. I think you are missing “Change the class of that object to the AppDelegate class” step.. please make sure you follow this and double check the IBOutlet in .h file

  2. Thank you so much !!!
    You helped me a lot.

    But the question is : “Why – in the name of god – do they have to change basic templates every iOS update?”
    I had not enough time to learn and fully understand iOS 4 dev that iOS 5 is already out and everything has changed, so no way to follow easily the tutorials.

  3. I was initially puzzled by this as well. When you change the class of the object you’ve added to MainWindow.xib, you need to change it to whatever your App Delegate class is actually called, not just AppDelegate. So if it’s called MainWindowAppDelegate then you need to change the class of your object to MainWindowAppDelegate as well.

  4. Pingback: My Homepage
  5. Thank you so much! I’ve been learning xCode with the help of old tutorials so your explanation of these changes helped a lot.

  6. Another “thank you” for this article. I’m picking up some sample code from Dropbox and this explains what was missing when I tried to recreate it in Xcode 4.2.

    Thanks!

  7. hello,

    With the last step my code looks a little different. It looks like this…

    – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
    //self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
    }

    I just commented it out because I didn’t want to delete anything.

    Will this work?

    Jeff

  8. I(t always crashes with Following message

    *** Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘There can only be one UIApplication instance.’

    Have you missed some changes to be done in main.m file

  9. Thank you so much! I was doing all of this already except the last bit where you had to delete the line of code that creates new window in the .m file. I was starting to get really frustrated. Again, thanks a lot!

Leave a Reply

Your email address will not be published. Required fields are marked *