the life and times of uiviewcontroller
TRANSCRIPT
The Life and Times of UIViewController
Brandon Alexander
Wednesday, September 18, 13
Who am IiOS Developer, Author, Speaker
Email: [email protected]
GTalk: [email protected]
Twitter/ADN: @balexander
Wednesday, September 18, 13
Design Pattern
A general reusable solution to a commonly occurring problem within a given context in software design
Wednesday, September 18, 13
MVC
• Model
• View
• Controller
Wednesday, September 18, 13
Controller
• Mediates between view and model
• Subclasses UIViewController
Wednesday, September 18, 13
Agenda
Wednesday, September 18, 13
Agenda
• UIViewController Lifecycle
Wednesday, September 18, 13
Agenda
• UIViewController Lifecycle
• Presenting other view controllers
Wednesday, September 18, 13
Agenda
• UIViewController Lifecycle
• Presenting other view controllers
• View Controller Containment
Wednesday, September 18, 13
Agenda
• UIViewController Lifecycle
• Presenting other view controllers
• View Controller Containment
• [REDACTED]
Wednesday, September 18, 13
Lifecycle
• Creation
• Interaction
• Destruction
Wednesday, September 18, 13
Creation
• NIB (or XIB)
• Storyboard
• In Code
Wednesday, September 18, 13
NIB
- (id) initWithNibName:(NSString *)n bundle:(NSBundle *)b
Wednesday, September 18, 13
Storyboard
- (instancetype) initWithCoder:(NSCoder *)c
Wednesday, September 18, 13
Code
- (instancetype) init- (instancetype) initWith...
- (void) loadView
Wednesday, September 18, 13
Creation Tips
• Wait for viewDidLoad for some startup items
• Don’t reference vc.view before viewDidLoad is called
• Use -[UIVC isViewLoaded]
• Use UIGestureRecognizer when possible
Wednesday, September 18, 13
Interaction
• Respond to user actions
• Delegate/Data Source Methods
• Respond to rotation events
• Respond to application notifications
• Navigate to other view controllers
Wednesday, September 18, 13
Important Methods- (void) viewWillAppear:(BOOL)animated- (void) viewDidAppear:(BOOL)animated
- (void) viewWillDisappear:(BOOL)animated- (void) viewDidDisappear:(BOOL)animated
- (void) viewWillLayoutSubviews- (void) viewDidLayoutSubviews
- (void) didReceiveMemoryWarning
Wednesday, September 18, 13
Rotation Support
• Info.plist shows all supported orientations
• Implement proper methods to support each orientation in each view controller
Wednesday, September 18, 13
Interaction Tips
• Split Data Source methods out to helper objects
• Keep the focus of the class in mind
Wednesday, September 18, 13
Destruction
• Implement dealloc when necessary
• Many existing UIKit classes aren’t ARCified
• Set delegate/dataSource properties to nil
Wednesday, September 18, 13
Presenting View Controllers
! //Create VC! UIViewController *vc = [UIViewController new];!! //Configure! vc.modalPresentationStyle = UIModalPresentationFormSheet;! vc.modalTransitionStyle = UIModalTransitionStyleCoverVertical;!! //Present! [self presentViewController:vc animated:YES completion:nil];
Wednesday, September 18, 13
Dismissing Presented View Controllers
• Multiple Approaches
• Delegation
• Post to the responder chain
• Don’t have a view controller dismiss itself
Wednesday, September 18, 13
View Controller Containment
• Keeps View Controller hierarchy the same as the view hierarchy
• Helps solve the Massive View Controller anti-pattern
Wednesday, September 18, 13
Adding a Child VC
- (void) displayContentController: (UIViewController*) content {! [self addChildViewController:content];! content.view.frame = [self frameForContentController];! [self.view addSubview:self.currentClientView];! [content didMoveToParentViewController:self];}
Wednesday, September 18, 13
Removing a child VC
- (void) hideContentController: (UIViewController*) content {! [content willMoveToParentViewController:nil];! [content.view removeFromSuperview];! [content removeFromParentViewController];}
Wednesday, September 18, 13
Other Containment Methods
- (BOOL) shouldAutomaticallyForwardAppearanceMethods- (BOOL) shouldAutomaticallyForwardRotationMethods
Wednesday, September 18, 13
iOS 7
• Custom View Controller Transitions
• Different layout paradigms
• -automaticallyAdjustsScrollViewInsets
• UIKit Dynamics
Wednesday, September 18, 13
Architecture
• Avoid Massive View Controllers
• Centralize networking code
• Controllers don’t have to be view controllers
Wednesday, September 18, 13
Other Tricks
• Use nil-target actions in views
• Lazy load in container view controllers
• Don’t bother cleaning up in will(Dis)Appear
Wednesday, September 18, 13
Resources
• View Controller Programming Guide
• About Cocoa Auto Layout
• iOS 7 UI Transition Guide
Wednesday, September 18, 13
Questions
Wednesday, September 18, 13
Contact
Email: [email protected]
GTalk: [email protected]
Twitter/ADN: @balexander
Wednesday, September 18, 13