Thursday, November 12, 2009

Build an iPhone application without Interface Builder

I am still a beginner of iPhone developer. I finished a tutorial book. Right now I am trying to read another one. But I found my problem: I only know how to build the application using the Interface Builder, but I don’t know the underlying mechanism of the application, for example; what is the life cycle of the application, how does the application delegate, ViewController and View interact each other?

Using Interface Builder makes the application developing very easy, it separate out the presentation logic with the application logic. I like this idea, but for beginner only know the Interface Builder is not enough:
- It makes your job easier, but also hides the application information, and blocks you to understand the underlying mechanism. For example, When I investigate the sample code LocateMe, it uses UITabBarController and NavigationgController for each tab, when I read the source code, I don’t know the where the variable navigationController come from, I don’t know how it created. It is set in the nib file, and you have to read the reference document to see how it works.

- Sometime you need to customize your app, Interface Builder will not help you, you have to do it programmatically. For example, I tried to add a UIScrollView using the interface builder, but I found it does not scroll as I expected.

I google the solution and found this video is helpful:

Building iPhone Applications without Interface Builder from Troy Mcilvena on Vimeo.


And this blog:Why would you use Interface Builder for iPhone Development?

I just summarize the detailed steps:

1. In Xcode wizard, choose Window-based Application, then delete the MainWindow.xib, remove the property with the key ‘Main nib file base name’ (the raw key name is ‘NSMainNibFile’) from your Info.plist file.

2. In main.m, add your AppDelegate class name in the last argument of the UIApplicationMain method.

int main(int argc, char *argv[]) {

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


3. In AppDelegate class, initialize and configure the window and Controller object.

For example: NoNibAppDelegate.m
- (void)applicationDidFinishLaunching:(UIApplication *)application {

// Override point for customization after application launch
window = [[UIWindow alloc] initWithFrame:[ [UIScreen mainScreen] bounds]];

RootViewController *root = [[RootViewController alloc] init];
[window addSubview:root.view];
[window makeKeyAndVisible];
}


4. In your ViewController class, implement the loadView() method
From UIViewController Reference document: If you create your views manually, you must override this method and use it to create your views
- (void)loadView
{

UIView *contentView = [[ButtonView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];

self.view = contentView;
[contentView release];


}


5. In View class, implement the initWithFrame: method
“If you create a view object programmatically, this method is the designated initializer for the UIView class.” - From UIView reference document.
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {

self.backgroundColor = [UIColor lightGrayColor];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 30.0f)];
label.text = @"Hello World";
label.center = self.center;
label.backgroundColor = [UIColor clearColor];
label.textAlignment = UITextAlignmentCenter;

[self addSubview:label];
}
return self;
}


6. You might want to register an UIControl event listener:
- Intitialize the UIControl object, for example a UIButton:
[buttonPress addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];


- implement the event call back method:
-(void)buttonClicked:(id)sender
{
UIButton *button = (UIButton *)sender;
NSString *text = button.currentTitle;


NSString *string = [ [NSString alloc] initWithFormat:@"Button %@ pressed.",text];

NSLog(@"button clicked. button title:%@", text);

self.label.text = string;
[string release];

}


You can download my sample code from here.


From this investigation, I understand the iPhone application life cycle and event flow; know the underlying mechanism and get the confidence to customize application in future.

For learning iPhone, I am trying to follow the Shu-Ha-Ri learning model: at the Shu level, which is called following and copying, so I just follow one book: Beginning iPhone 3 Development: Exploring the iPhone SDK. I just follow step by step, copy every line of the code from the book. This is a very good book for the beginner who never touch the apple development environment like me, but it does not cover the deeper information, which I am really want to understand now.

So I think it is time for me to go to Ha level: which is breaking, it means trying to collecting different information and trying to read different article and books, Now I learned that it is time for me and I am ready to read Apple reference document, read advanced iPhone books, investigate the sample code, joining the forum, and practice.


Tutorial gives you a starting point, Interface Builder is a crutch, it is time for you to remove them if you want to get improved.

Here is my reading list for iPhone in fufure:
- Apple iPhone reference documents and API documents
- Apple iPhone sample codes
- The iPhone Developer's Cookbook: Building Applications with the iPhone SDK
This is a really good book, but not for beginner, it tells your more detailed information which is not covered in other books. I am waiting for the 2nd edtion.


References:
- iPhone Application Programming Guide

- The iPhone Developer's Cookbook: Building Applications with the iPhone SDK

15 comments:

  1. Most iPhone applications are relatively inexpensive. With so many apps available it is important to keep the price down so that users will purchase the app.

    ReplyDelete
  2. It's really great that iPhone's really striving to give the users everything they possibly need in a mobile phone.

    ReplyDelete
  3. just did potty after reading this...thanks!

    ReplyDelete
  4. Good tutorial. Unfortunately your download link doesn't work. Can you repost the binaries?

    ReplyDelete
  5. your link to sample code is unfortunately broken!

    ReplyDelete
  6. The old link is expired, sorry for that. I just upload my sample code in the git hub:
    https://github.com/stevez/iOS_nonib_sample

    And Also I update the link in my article as well.

    Thanks for pointing out.

    ReplyDelete
  7. Nice Post

    For More Information You Can Visit This Website iPhone Application Development Solutions

    ReplyDelete
  8. iphone app development in iOS framework much better after you no worries to compatible with others frameworks. All well reputed organizations developed these types of applications that have fewer chances of compatibles errors.

    ReplyDelete
  9. John hereiphone app development services plays an important role in mobile world. Keep sharing this type of information on regular basis, it will surely help young developers

    ReplyDelete
  10. Capanicus as a iPhone Application Development Company in India understand that the application is not about your organization, and it is not about our company and designers.

    iPhone Application Development Company in India

    ReplyDelete
  11. Really nice blog.It contains very informative content. Good job.........
    Mobile Application Development

    ReplyDelete
  12. 1. How To Build iOS Apps Without Interface Builder
    2. But why?
    3. IB vs. Code (I) • Context shift • More evil conflicts • Options all over the place • Harder to get help • No betas for you
    4. IB vs. Code (II) • No inheritance • Harder to DRY • Hard to see contraints • Really bad performance
    5. Delete Storyboard
    6. AppDelegate.swift import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? = UIWindow(frame: UIScreen.mainScreen().bounds) func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { window?.rootViewController = ViewController() window?.makeKeyAndVisible() return true } }
    7. UINavigationController import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? = UIWindow(frame: UIScreen.mainScreen().bounds) func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { window?.rootViewController = UINavigationController(rootViewController: ViewController()) window?.makeKeyAndVisible() return true } }
    8. Loading The View override func loadView() { view = FirstView() }
    9. Demo • Login-Screen • Auto Layout • UIStackView • UITableView / UITableViewCell • UINavigationController • UITabBarController



    Iphone App Developers

    ReplyDelete
  13. First of all, thanks for all the useful information. I want to thank you for emphasizing the importance of playing an important role in the accommodation industry. I appreciate your hard work. Keep posting new updates with us.

    MindtechAffiliates.com

    ReplyDelete
  14. Thank you for posting this awesome article. I’m a long time reader but I’ve never been compelled to leave a comment. If you are interested in Android Application Development Company or want to discuss the importance of Mobile Application in the present scenario, contact anytime.
    You can also contact here, if you are looking forward to Hire Android App Developers

    ReplyDelete