leaving interface builder behind
DESCRIPTION
Want to squeeze every last bit of performance out of your apps? I will show you how to let go of using Interface Builder to create better performing, more optimized, and leaner apps. I'll walk you through why it's better, how to create and move projects off of IB, building your UI in code, and how to gain a better understanding of how your code works from the ground up.TRANSCRIPT
![Page 1: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/1.jpg)
Leaving Behind
![Page 2: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/2.jpg)
Hello.
• Jake Behrens
• iPhone/Mobile Developer
• UI Designer
![Page 3: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/3.jpg)
Hello.
• Freelancer (as of last Friday!)
![Page 4: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/4.jpg)
![Page 5: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/5.jpg)
![Page 6: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/6.jpg)
![Page 7: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/7.jpg)
Moments
• Choose, but choose wisely.
• Do it for the experience.
![Page 8: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/8.jpg)
30,000 Ft.
![Page 9: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/9.jpg)
![Page 10: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/10.jpg)
![Page 11: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/11.jpg)
Why?
• Knowledge.
• Code reuse.
• Performance.
• Custom = code.
• Tidbits here and there...
![Page 12: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/12.jpg)
A Story
![Page 13: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/13.jpg)
![Page 14: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/14.jpg)
![Page 15: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/15.jpg)
Delegates
![Page 16: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/16.jpg)
Delegates
Outlets
![Page 17: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/17.jpg)
Delegates
Outlets
Location
![Page 18: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/18.jpg)
Time
![Page 19: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/19.jpg)
Code Reuse
![Page 20: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/20.jpg)
Code vs. GUI
CGRect submitButtonFrame = CGRectMake(10.0, 276.0, 300.0, 130.0);UIImage *tempSubmitButtonUp = [UIImage imageNamed:@"SubmitButton_Up.png"];UIImage *tempSubmitButtonDown = [UIImage imageNamed:@"SubmitButton_Down.png"];submitButton = [UIButton buttonWithType:UIButtonTypeCustom];[submitButton setImage:tempSubmitButtonUp forState:UIControlStateNormal];[submitButton setImage:tempSubmitButtonDown forState:UIControlStateHighlighted];[submitButton setFrame:submitButtonFrame];[submitButton addTarget:self action:@selector(submitReport)
forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:submitButton];
![Page 21: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/21.jpg)
Snippets
www.snippetapp.com
![Page 22: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/22.jpg)
Performance
![Page 23: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/23.jpg)
Performance
• Benchmarks.
![Page 24: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/24.jpg)
Performance
• View-based application
![Page 25: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/25.jpg)
Performance
• View-based application
• With IB: 37ms
![Page 26: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/26.jpg)
Performance
• View-based application
• With IB: 37ms
• Without IB: 23ms
![Page 27: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/27.jpg)
Performance
• View-based application w/ UIImageView
![Page 28: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/28.jpg)
Performance
• View-based application w/ UIImageView
• With IB: 47ms
![Page 29: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/29.jpg)
Performance
• View-based application w/ UIImageView
• With IB: 47ms
• Without IB: 25ms
![Page 30: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/30.jpg)
![Page 31: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/31.jpg)
![Page 32: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/32.jpg)
Performance
![Page 33: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/33.jpg)
Performance
![Page 34: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/34.jpg)
Performance
1. Build your app.2. Run
> Run with Performance Tool > Core Animation
![Page 35: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/35.jpg)
Performance
![Page 36: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/36.jpg)
Performance
![Page 37: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/37.jpg)
Performance
• 14 elements in each cell.
![Page 38: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/38.jpg)
Performance
• 14 elements in each cell.
• With IB: 13-23 FPS
![Page 39: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/39.jpg)
Performance
• 14 elements in each cell.
• With IB: 13-23 FPS
• Without IB: 43-60 FPS
![Page 40: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/40.jpg)
Customizing
Iʼm a button!!
![Page 41: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/41.jpg)
Customizing
Iʼm a
button!!
![Page 42: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/42.jpg)
Customizing
[UIView beginAnimations:nil context:nil];[UIView setAnimationDuration:0];[UIView setAnimationDelegate:self];myButton.transform = CGAffineTransformMakeRotation
([Utilities degreesToRadians:45]);[UIView commitAnimations];
![Page 43: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/43.jpg)
Customizing
Iʼm a button!!
![Page 44: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/44.jpg)
Customizing
Iʼm a
button!!
![Page 45: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/45.jpg)
Tidbits & Food 4 Thought
![Page 46: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/46.jpg)
Source Control
![Page 47: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/47.jpg)
<string key="NSFrame">{{20, 20}, {280, 37}}</string>
![Page 48: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/48.jpg)
<string key="NSFrame">{{20, 20}, {280, 37}}</string>
![Page 49: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/49.jpg)
myButton.frame = CGRectMake(20.0, 20.0, 280.0, 37.0);
![Page 50: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/50.jpg)
myButton.frame = CGRectMake(20.0, 20.0, 280.0, 37.0);
![Page 51: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/51.jpg)
Refactor...
• When changing a method name.
• IB doesnʼt fix your action.
![Page 52: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/52.jpg)
Bug Report
• Great opportunity to tell Apple.
![Page 53: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/53.jpg)
“Premature optimization is the root
of all evil.”
![Page 54: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/54.jpg)
So now what?
![Page 55: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/55.jpg)
![Page 56: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/56.jpg)
![Page 57: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/57.jpg)
Tutorials!
![Page 58: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/58.jpg)
View-based Application
![Page 59: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/59.jpg)
![Page 60: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/60.jpg)
![Page 61: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/61.jpg)
![Page 62: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/62.jpg)
Resources
• Remove .xib files.
![Page 63: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/63.jpg)
main.m
#import <UIKit/UIKit.h>
int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal;}
![Page 64: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/64.jpg)
main.m
#import <UIKit/UIKit.h>
int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, @”AppDelegate”); [pool release]; return retVal;}
![Page 65: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/65.jpg)
AppDelegate.h
#import <UIKit/UIKit.h>
@class DemoViewController;
@interface AppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; DemoViewController *viewController;}
@property (nonatomic, retain) IBOutlet UIWindow *window;@property (nonatomic, retain) IBOutlet DemoViewController *viewController;
@end
![Page 66: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/66.jpg)
AppDelegate.h
#import <UIKit/UIKit.h>
@class DemoViewController;
@interface AppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; DemoViewController *viewController;}
@property (nonatomic, retain) UIWindow *window;@property (nonatomic, retain) DemoViewController *viewController;
@end
![Page 67: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/67.jpg)
AppDelegate.m
- (void)applicationDidFinishLaunching:(UIApplication *)application { // Override point for customization after app launch [window addSubview:viewController.view]; [window makeKeyAndVisible];}
![Page 68: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/68.jpg)
AppDelegate.m
- (void)applicationDidFinishLaunching:(UIApplication *)application { window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];!! viewController = [[DemoViewController alloc] init];! // Override point for customization after app launch [window addSubview:viewController.view]; [window makeKeyAndVisible];}
![Page 69: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/69.jpg)
Custom Xcode Templates
![Page 70: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/70.jpg)
Why?
• Set it up the way you want it.
• Include libraries you use.
![Page 71: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/71.jpg)
Path of Originals
![Page 72: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/72.jpg)
AppDelegate.h
#import <UIKit/UIKit.h>
@class ___PROJECTNAMEASIDENTIFIER___ViewController;
@interface ___PROJECTNAMEASIDENTIFIER___AppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; ___PROJECTNAMEASIDENTIFIER___ViewController *viewController;}
@property (nonatomic, retain) IBOutlet UIWindow *window;@property (nonatomic, retain) IBOutlet ___PROJECTNAMEASIDENTIFIER___ViewController *viewController;
@end
![Page 73: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/73.jpg)
Points of Interest
• Delete the build folder.
• .xcodeproj
![Page 74: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/74.jpg)
Issues with updates...
![Page 75: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/75.jpg)
Path to Customs
![Page 76: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/76.jpg)
http://github.com/withfoam
![Page 77: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/77.jpg)
Graphical Elements In Code
![Page 78: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/78.jpg)
.h
#import <UIKit/UIKit.h>
@interface DemoViewController : UIViewController {! UILabel *displayText;}
@property (nonatomic, retain) UILabel *displayText;
@end
![Page 79: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/79.jpg)
.m#import "DemoViewController.h"
@implementation DemoViewController
@synthesize displayText;
#pragma mark -#pragma mark Application lifecycle
- (void)loadView {! [super loadView];!! displayText = [[UILabel alloc] init];! [displayText setFrame:CGRectMake(20.0, 20.0, 280.0, 30.0)];! [displayText setText:@"Hello 360iDev!"];! [displayText setFont:[UIFont fontWithName:@"Helvetica" size:14.0]];! [self.view addSubview:displayText];}
![Page 80: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/80.jpg)
.m
- (void)dealloc {! [displayText release]; [super dealloc];}
![Page 81: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/81.jpg)
Yay...
![Page 82: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/82.jpg)
.m
- (void)loadView {! [super loadView];!! displayText = [[UILabel alloc] init];! [displayText setFrame:CGRectMake(20.0, 20.0, 280.0, 30.0)];! [displayText setText:@"Hello 360iDev!"];! [displayText setFont:[UIFont fontWithName:@"Helvetica" size:24.0]];! [displayText setBackgroundColor:[UIColor blackColor]];! [displayText setTextColor:[UIColor greenColor]];! [displayText setTextAlignment:UITextAlignmentCenter];! [self.view addSubview:displayText];}
![Page 83: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/83.jpg)
Yay...
![Page 84: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/84.jpg)
UIButton...again.
CGRect submitButtonFrame = CGRectMake(10.0, 276.0, 300.0, 130.0);UIImage *tempSubmitButtonUp = [UIImage imageNamed:@"SubmitButton_Up.png"];UIImage *tempSubmitButtonDown = [UIImage imageNamed:@"SubmitButton_Down.png"];submitButton = [UIButton buttonWithType:UIButtonTypeCustom];[submitButton setImage:tempSubmitButtonUp forState:UIControlStateNormal];[submitButton setImage:tempSubmitButtonDown forState:UIControlStateHighlighted];[submitButton setFrame:submitButtonFrame];[submitButton addTarget:self action:@selector(submitReport) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:submitButton];
![Page 85: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/85.jpg)
RE:cap
• Increased performance.
• Organization.
• Little things.
![Page 86: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/86.jpg)
Tuts
• Revert apps created for IB.
• Create customized project templates.
• Create graphical elements and objects in code.
![Page 87: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/87.jpg)
Yell at me.
• http://jakebehrens.com
• @withfoam
• http://withfoam.com
• http://github.com/withfoam
![Page 88: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/88.jpg)
Feel lucky?
• R634EJ39MA44
• 77Y7YEL9F6AR
• 3EKR3FAETJPF
• 4KT7EMWHP47P
• EMM4H9XTF6JT
• ERMFPKRR69X6
![Page 89: Leaving Interface Builder Behind](https://reader034.vdocuments.us/reader034/viewer/2022052505/5551e0c4b4c90501638b4b47/html5/thumbnails/89.jpg)
Hecklers? Questions?