<

Expiring Today—Celebrate National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x

If You Don't Need Interface Builder.

Published on
16,930 Points
7,230 Views
2 Endorsements
Last Modified:
Awarded

Preface

I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small and trivial, when few standard GUI controls could be arranged easily on the basic view and, then, connected to my code objects in Interface Builder.

At some point, though, the programs became a little bigger than a simple tutorial program, a little more complicated than one full-screen view with three labels and one button. Now I have to worry about having enough memory for my application and I so I now desire to eliminate everything related to Interface Builder.

This article shows how to accomplish this using an easy and fast trick.

iPhone Application Project.

Let's make a simple iPhone project:

1. Create new iPhone window-based application project.


In Xcode, in menu File, select "New Project...". In the project wizard sidebar select Application in the iPhone OS section. Select Windows-based Application in the right panel and click on Choose button in the bottom-right corner. In the Save panel give a name for the project. For example, "Simple", and click Save button.

These two screenshots illustrate this step: Xcode Project Wizard Set Project Name

2. Delete Classes folder and xib-file.


In Xcode project window, find Classes folder and delete it - select "Classes" item, click on the right mouse button and in the popup menu select "Delete". In the alert window click on "Also move to trash" button.

When the project (the most top item) is selected in the Xcode sidebar, on the right panel you see all project files. Find MainWindow.xib file and delete it too.

Here are the screenshots: Xcode Project Window Delete Classes Group Delete Alert Delete MainWindow.xib

3. Modify *-info.plist file.


Click on Simple-info.plist file to select it. The bottom panel shows the file content. There is a line about the MainWindow.xib file:  "Main nib-file base name". The last one in my file. Delete it. Delete Simple-info.plist

4. Modify main.m file.


Source code of this program will be in main.m file. Open this file for editing and add new application delegate class. Use the class name in the main function. Basically, it means to replace the original content of main.m file with the following code:
#import <UIKit/UIKit.h>

// Application delegate
@interface Simple : NSObject <UIApplicationDelegate>
{
}

@end

@implementation Simple

- (void)applicationDidFinishLaunching: (UIApplication*)application
{
    UIWindow* window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
    [window setBackgroundColor: [UIColor orangeColor]];
    [window makeKeyAndVisible];
}

@end

int main(int argc, char *argv[]) 
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, @"Simple");
    [pool release];
    return retVal;
}

Open in new window


New application delegate class defined in the code above has name Simple. This name is used in the main function.
int retVal = UIApplicationMain(argc, argv, nil, @"Simple");

Open in new window

5. Run on iPhone Simulator.


Be sure that the active configuration is Debug and Simulator is selected as the target device. Popup button in the Xcode Toolbar allows changing the active configuration and the target device. Configuration
Press "Build & Run" button to launch the program.Simple Application Running.

Improvements

This program does not have an icon, so iPhone Simulator shows a white rectangle instead. Icon for the iPhone application is a PNG-image. In the simplest case it has size 57x57 pixels and the name is icon.png. Drag any image that fits to this requirement to the resource folder in the Xcode project. Do not forget to check "Copy item to the destination group folder":Project resourcesIcon for iPhone project Image for the splash screen
I attached my icon.png file as an example. I attached also Default.png - this is another special image that is used by iOS without any coding required from the developer. Add this image to the project resources. Build and launch the application. When it is loaded, this Default.png works as a splash screen.Default.png added

Practical Use

Everything related to Interface Builder was removed from the iPhone project. The source code is concentrated in main.m file. It is very convenient when I'm learning, when I need to check or to test something quickly - a language feature,  new API or an idea.

For example, the code below placed in the -applicationDidFinishLaunching method will show how to work the Cocoa date/timer formatter:
- (void)applicationDidFinishLaunching: (UIApplication*)application
{
    UIWindow* window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
    [window setBackgroundColor: [UIColor orangeColor]];

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDoesRelativeDateFormatting: YES];
    [formatter setDateStyle: NSDateFormatterLongStyle];
    [formatter setTimeStyle: NSDateFormatterShortStyle];
    
    NSDate *now = [NSDate date];
    NSString *formattedDateTime = [formatter stringFromDate: now];
    
    NSLog(@"Formatted Date: %@", formattedDateTime);
    
    [formatter release];	
    [window makeKeyAndVisible];
}

Open in new window

Running applicationDeleted xib-file does not mean that my program cannot have a GUI. Next code snippet demonstrate a GUI application:
#import <UIKit/UIKit.h>

@interface SimpleController : UIViewController
{
}
@end

@implementation SimpleController

- (id)init
{
	if (self = [super init])
	{
		self.title = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];
	}
	return self;
}

- (void)loadView
{
	// Load an application image and set it as the primary view
	UIImageView* contentView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
	[contentView setImage:[UIImage imageNamed:@"Abackground.png"]];
	
	// Provide support for auto-rotation and resizing
	contentView.autoresizesSubviews = YES;
	contentView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
	
	// Assign the view to the view controller
	self.view = contentView;
        [contentView release]; 
}

-(void) dealloc
{
	[super dealloc];
}
@end

@interface Simple : NSObject <UIApplicationDelegate> 
{
}
@end

@implementation Simple

- (void)applicationDidFinishLaunching:(UIApplication *)application 
{	
	UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
	UINavigationController *nav = [[UINavigationController alloc] 
                                                          initWithRootViewController:[[SimpleController alloc] init]];
	[window addSubview:nav.view];
	[window makeKeyAndVisible];
}

- (void)applicationWillTerminate:(UIApplication *)application  
{
}

- (void)dealloc 
{
	[super dealloc];
}

@end

int main(int argc, char *argv[])
{
	NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
	int retVal = UIApplicationMain(argc, argv, nil, @"Simple");
	[pool release];
	return retVal;
}

Open in new window

This code defines the simplest view controller (SimpleController class) which creates a UIImageView and set an image to it. Here is the application screenshot:
Application screenshot.

References

iOS Reference Library. The Core Application Design
2
Comment
Author:pgnatyuk
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
0 Comments

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

Join & Write a Comment

The goal of this video is to provide viewers with basic examples to understand opening and writing to files in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use nested-loops in the C programming language.

Keep in touch with Experts Exchange

Tech news and trends delivered to your inbox every month