- Creating New Projects
- Building Hello World the Template Way
- Using the Simulator
- The Minimalist Hello World
- Converting Interface Builder Files to Their Objective-C Equivalents
- Using the Debugger
- Memory Management
- Recipe: Using Instruments to Detect Leaks
- Recipe: Using Instruments to Monitor Cached Object Allocations
- Analyzing Your Code
- Building for the iOS Device
- Detecting Simulator Builds with Compile-Time Checks
- Performing Runtime Compatibility Checks
- Pragma Marks
- Preparing for Distribution
- Over-the-Air Ad Hoc Distribution
- Submitting to the App Store
- Summary
Converting Interface Builder Files to Their Objective-C Equivalents
A handy open-source utility by Adrian Kosmaczewski allows you to convert Interface Builder files to Objective-C code. With it, you can extract all the layout information and properties of your visual design and see how that would be coded by hand. nib2objc does exactly what its name suggests. With it, you can generate converted code that takes into account the class constructors, method calls, and more. It works on .xib and .storyboard files, although some newer features such as segues are not yet exposed; under the hood both formats are simply XML.
Listing 3-2 shows the result of running nib2objc on the .xib file used in the first walkthrough. Compare it to the far simpler (and less thorough) by-hand version in Listing 3-1. It performs more or less the same tasks. It creates a new label and then adds the label to the window. However, this conversion utility exposes all the underlying properties, of which just a few were edited in Listing 3-1.
To peek at the original IB XML, open the storyboard file in Text Edit. Issue open -e from the Terminal command line while in the HelloWorld project folder in the en.lproj subfolder:
open -e MainStoryboard_iPad.storyboard
Listing 3-2. HelloWorldViewController.xib after Conversion to Objective-C
UIView *view3 = [[UIView alloc] initWithFrame: CGRectMake(0.0, 20.0, 320.0, 460.0)]; view3.frame = CGRectMake(0.0, 20.0, 320.0, 460.0); view3.alpha = 1.000; view3.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin; view3.backgroundColor = [UIColor colorWithRed:0.963 green:1.000 blue:0.536 alpha:1.000]; view3.clearsContextBeforeDrawing = YES; view3.clipsToBounds = NO; view3.contentMode = UIViewContentModeScaleToFill; view3.hidden = NO; view3.multipleTouchEnabled = NO; view3.opaque = YES; view3.tag = 0; view3.userInteractionEnabled = YES; UILabel *view6 = [[UILabel alloc] initWithFrame: CGRectMake(72.0, 150.0, 175.0, 160.0)]; view6.frame = CGRectMake(72.0, 150.0, 175.0, 160.0); view6.adjustsFontSizeToFitWidth = YES; view6.alpha = 1.000; view6.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin; view6.baselineAdjustment = UIBaselineAdjustmentAlignCenters; view6.clearsContextBeforeDrawing = YES; view6.clipsToBounds = YES; view6.contentMode = UIViewContentModeLeft; view6.enabled = YES; view6.hidden = NO; view6.lineBreakMode = UILineBreakModeTailTruncation; view6.minimumFontSize = 10.000; view6.multipleTouchEnabled = NO; view6.numberOfLines = 1; view6.opaque = NO; view6.shadowOffset = CGSizeMake(0.0, -1.0); view6.tag = 0; view6.text = @"Hello World"; view6.textAlignment = UITextAlignmentLeft; view6.textColor = [UIColor colorWithRed:0.000 green:0.000 blue:0.000 alpha:1.000]; view6.userInteractionEnabled = NO; [view3 addSubview:view6]; [view2 addSubview:view3];