Oct 27, 2011
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
Now add a window to objects pane.
</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









Thank you so much for this tutorial! This really helped de-mystify the changes in the generated project files after I upgraded to 4.2.
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.
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
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.
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.
Can you write how to do MainWindow with tab bar controller?
Thank you!
Ok, I’ll write next post on it…
Thank you very much, this tutorial help me a lot, thanks again.
Thank you very much….!!!!!!!!
thank you so much for this great tutorial!
Man! You absolutely save my life! Tks!
Thank you!!! It is very heplful!
I was stuck and you helped me man. Thanks a lot.
… [Trackback]…
[...] Read More here: makebetterthings.com/iphone/where-is-mainwindow-xib-in-xcode-4-2/ [...]…
Thank you so much pal!
Thank you so much.
Thank you so much! I’ve been learning xCode with the help of old tutorials so your explanation of these changes helped a lot.
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!
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
Awesome !!! It helped me learn concept of what is going on behind the scene …