Modular View Controller Hierarchies

206
Not Your Granddaddy's Architecture Building Modularity into View Controller Hierarchies

Transcript of Modular View Controller Hierarchies

Page 1: Modular View Controller Hierarchies

Not Your Granddaddy's Architecture

Building Modularity into View Controller Hierarchies

Page 2: Modular View Controller Hierarchies
Page 3: Modular View Controller Hierarchies
Page 4: Modular View Controller Hierarchies

The following takes place in an alternate reality

Page 5: Modular View Controller Hierarchies

Meet Jax

Page 6: Modular View Controller Hierarchies
Page 7: Modular View Controller Hierarchies

Jax is a super awesome app developer

Page 8: Modular View Controller Hierarchies

or at least, he thinks he is

Page 9: Modular View Controller Hierarchies

Jax pounds red bulls and talks about how sick his

coding skills are.

Page 10: Modular View Controller Hierarchies
Page 11: Modular View Controller Hierarchies

Most importantly, he loves watermelon

Page 12: Modular View Controller Hierarchies
Page 13: Modular View Controller Hierarchies

Jax just got hired working on the next world changing app.

Page 14: Modular View Controller Hierarchies

My Pet Alien

Page 15: Modular View Controller Hierarchies

My Pet Alien is an app that tracks your pet alien's health,

Page 16: Modular View Controller Hierarchies

and will alert you if your alien

is getting sick.

Page 17: Modular View Controller Hierarchies
Page 18: Modular View Controller Hierarchies

"Sure, that will take 2 months, EASY.” - Jax

Page 19: Modular View Controller Hierarchies
Page 20: Modular View Controller Hierarchies

Jax spends the next 2 months pounding red bulls, building flows in Interface builder, and coding the entire app.

Page 21: Modular View Controller Hierarchies

(we’re going to jump into Jax’s train of thought as

he builds this out)

Page 22: Modular View Controller Hierarchies
Page 23: Modular View Controller Hierarchies

Jax thinks back to 2009…

Page 24: Modular View Controller Hierarchies
Page 25: Modular View Controller Hierarchies

Jax fell in love with iOS at WWDC

Page 26: Modular View Controller Hierarchies
Page 27: Modular View Controller Hierarchies

That’s where Jax learned how to build navigation flows.

Page 28: Modular View Controller Hierarchies
Page 29: Modular View Controller Hierarchies

He even got to see Scott on stage

Page 30: Modular View Controller Hierarchies

If you’re asking who Scott is…

Page 31: Modular View Controller Hierarchies
Page 32: Modular View Controller Hierarchies

Jax looks at the designs…

Page 33: Modular View Controller Hierarchies
Page 34: Modular View Controller Hierarchies

“Apps are made of view controller hierarchies”

Page 35: Modular View Controller Hierarchies

“Ok, I need a nav controller and three

content view controllers”

Page 36: Modular View Controller Hierarchies

Jax begins sketching this out

Page 37: Modular View Controller Hierarchies

Container View Controller

Content View Controller

Navigation Controller, Tab Controller, Page View Controller, Split View Controller, custom

Table View Controller, Collection View Controller, custom

Page 38: Modular View Controller Hierarchies

View Controller Hierarchy

Home View Controller

Table View Controller

Detail View Controller

WindowNavigation Controller

Root View Controller

Page 39: Modular View Controller Hierarchies

Jax opens up a storyboard and starts building.

Page 40: Modular View Controller Hierarchies
Page 41: Modular View Controller Hierarchies

Lets review how this works

Page 42: Modular View Controller Hierarchies

View Controller Hierarchy

Home View Controller

Table View Controller

Detail View Controller

WindowNavigation Controller

Root View Controller

Page 43: Modular View Controller Hierarchies

View Controller Hierarchy

Home View Controller

Table View Controller

Detail View Controller

Navigation Controller

Page 44: Modular View Controller Hierarchies

View Controller Hierarchy

Page 45: Modular View Controller Hierarchies

On App Launch…

Page 46: Modular View Controller Hierarchies

On App Launch…Storyboard

Page 47: Modular View Controller Hierarchies

On App Launch…Storyboard

Page 48: Modular View Controller Hierarchies

Storyboard

On User Interaction…Creates Table View Controller

Page 49: Modular View Controller Hierarchies

Storyboard

On User Interaction…Creates Table View Controller

Page 50: Modular View Controller Hierarchies

Storyboard

On User Interaction…Calls Prepare for Segue

Page 51: Modular View Controller Hierarchies

On User Interaction…HomeViewController.swiftoverride func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

Storyboard

Page 52: Modular View Controller Hierarchies

On User Interaction…HomeViewController.swiftoverride func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

Match Segue string

Storyboard

Page 53: Modular View Controller Hierarchies

On User Interaction…HomeViewController.swiftoverride func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

Match Segue string

Cast new VC

Storyboard

Page 54: Modular View Controller Hierarchies

On User Interaction…HomeViewController.swiftoverride func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

Match Segue string

Cast new VC

Set up new VC

Storyboard

Page 55: Modular View Controller Hierarchies

Storyboard Pushes View Controller onto Stack

On User Interaction…

Page 56: Modular View Controller Hierarchies

Storyboard

On Cell Selection…

Page 57: Modular View Controller Hierarchies

Storyboard

On Cell Selection…TableViewController.swiftfunc tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

Page 58: Modular View Controller Hierarchies

Storyboard

On Cell Selection…TableViewController.swiftfunc tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

Store Selected ID

Page 59: Modular View Controller Hierarchies

Storyboard

On Cell Selection…TableViewController.swiftfunc tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

Store Selected ID

Perform Segue

Page 60: Modular View Controller Hierarchies

Storyboard Creates Detail View Controller

On Cell Selection…

Page 61: Modular View Controller Hierarchies

Storyboard Creates Detail View Controller

On Cell Selection…

Page 62: Modular View Controller Hierarchies

Storyboard Calls Prepare for Segue

On Cell Selection…

Page 63: Modular View Controller Hierarchies

Storyboard

On Cell Selection…TableViewController.swiftoverride func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

Page 64: Modular View Controller Hierarchies

Storyboard

On Cell Selection…TableViewController.swiftoverride func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

Match Segue string

Page 65: Modular View Controller Hierarchies

Storyboard

On Cell Selection…TableViewController.swiftoverride func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

Match Segue string

Cast new VC

Page 66: Modular View Controller Hierarchies

Storyboard

On Cell Selection…TableViewController.swiftoverride func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

Match Segue string

Cast new VC

Set up new VC

Page 67: Modular View Controller Hierarchies

Storyboard Pushes View Controller onto Stack

On Cell Selection…

Page 68: Modular View Controller Hierarchies

2 months later, Jax is done!

Page 69: Modular View Controller Hierarchies
Page 70: Modular View Controller Hierarchies
Page 71: Modular View Controller Hierarchies

Success!

Page 72: Modular View Controller Hierarchies
Page 73: Modular View Controller Hierarchies

Jax looks at iTunes Connect

Page 74: Modular View Controller Hierarchies
Page 75: Modular View Controller Hierarchies

The downloads are pouring in.

Page 76: Modular View Controller Hierarchies

The investors are interested.

Page 77: Modular View Controller Hierarchies

Funded!

Page 78: Modular View Controller Hierarchies

Turns out there’s a lot of alien pet owners out there!

Page 79: Modular View Controller Hierarchies

With all the new $ and feature requests, the

company decides to hire another engineer.

Page 80: Modular View Controller Hierarchies

Meet Jiles

Page 81: Modular View Controller Hierarchies

Jiles is an application developer from Great Britain. A seasoned

professional.

Page 82: Modular View Controller Hierarchies

Jiles and Jax meet.

Page 83: Modular View Controller Hierarchies

Jiles congratulates Jax on his success.

Page 84: Modular View Controller Hierarchies
Page 85: Modular View Controller Hierarchies

Jiles asks Jax what he thinks of the application

architecture he has designed.

Page 86: Modular View Controller Hierarchies
Page 87: Modular View Controller Hierarchies

Jax says its the best, everything is

perfect.

Page 88: Modular View Controller Hierarchies

Jax tells the company he’s taking a month long vacation to Thailand.

Peace!

Page 89: Modular View Controller Hierarchies
Page 90: Modular View Controller Hierarchies

Jiles feels good about his new position and (seemingly) solid

codebase.

Page 91: Modular View Controller Hierarchies

The next day…

Page 92: Modular View Controller Hierarchies

The project manager asks Jiles to include the pet list screen before the

login screen.

Page 93: Modular View Controller Hierarchies

and to place a new detail screen between the pet list and pet detail.

Page 94: Modular View Controller Hierarchies

Jiles thinks to himself, ya know, Jax said the architecture was solid, this should take me

about 30 minutes.

Page 95: Modular View Controller Hierarchies
Page 96: Modular View Controller Hierarchies
Page 97: Modular View Controller Hierarchies

Jax starts working on moving the list and detail screens.

Page 98: Modular View Controller Hierarchies

Easy!

Page 99: Modular View Controller Hierarchies

Easy!

Page 100: Modular View Controller Hierarchies

Easy!

Page 101: Modular View Controller Hierarchies

Easy!

Page 102: Modular View Controller Hierarchies

Easy!

Page 103: Modular View Controller Hierarchies

Easy!

Page 104: Modular View Controller Hierarchies

So he thought…

Page 105: Modular View Controller Hierarchies

!?

EMPTY!

Page 106: Modular View Controller Hierarchies
Page 107: Modular View Controller Hierarchies

What’s going on here?

Page 108: Modular View Controller Hierarchies

Let’s review how Jax built this…

Page 109: Modular View Controller Hierarchies

On User Interaction…

Page 110: Modular View Controller Hierarchies

Storyboard

On User Interaction…Creates Table View Controller

Page 111: Modular View Controller Hierarchies

Storyboard

On User Interaction…Creates Table View Controller

Page 112: Modular View Controller Hierarchies

Storyboard

On User Interaction…Calls Prepare for Segue

Page 113: Modular View Controller Hierarchies

On User Interaction…HomeViewController.swiftoverride func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

Match Segue string

Cast new VC

Set up new VC

Storyboard

Page 114: Modular View Controller Hierarchies

On User Interaction…HomeViewController.swiftoverride func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

Match Segue string

Cast new VC

Set up new VC

Storyboard

Home VC fetches Table VC’s data

Isolate content view controllers!

Content controllers should know how to retrieve their own data

Page 115: Modular View Controller Hierarchies

!?

EMPTY!

Page 116: Modular View Controller Hierarchies

!?COUPLED CONTENT

View controllers!

Page 117: Modular View Controller Hierarchies

It’s now 2 am…

Page 118: Modular View Controller Hierarchies

After an hour of re-wiring, Jax moves on to adding the new screen.

Page 119: Modular View Controller Hierarchies

“Well at least this one will be easy!”

Page 120: Modular View Controller Hierarchies

Easy!

Page 121: Modular View Controller Hierarchies

Easy!

Page 122: Modular View Controller Hierarchies

So he thought…

Page 123: Modular View Controller Hierarchies
Page 124: Modular View Controller Hierarchies

What’s going on here?

Page 125: Modular View Controller Hierarchies

Let’s review how Jax built this…

Page 126: Modular View Controller Hierarchies

On Cell Selection…

Page 127: Modular View Controller Hierarchies

Storyboard

On Cell Selection…TableViewController.swiftfunc tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

Page 128: Modular View Controller Hierarchies

Storyboard

On Cell Selection…TableViewController.swiftfunc tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

Store Selected ID

Page 129: Modular View Controller Hierarchies

Storyboard

On Cell Selection…TableViewController.swiftfunc tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

Store Selected ID

Perform Segue

Page 130: Modular View Controller Hierarchies

Storyboard Creates New View Controller

On Cell Selection…

Page 131: Modular View Controller Hierarchies

Storyboard Creates New View Controller

On Cell Selection…

Page 132: Modular View Controller Hierarchies

Storyboard Calls Prepare for Segue

On Cell Selection…

Page 133: Modular View Controller Hierarchies

Storyboard

On Cell Selection…TableViewController.swiftoverride func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

Page 134: Modular View Controller Hierarchies

Storyboard

On Cell Selection…TableViewController.swiftoverride func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

Match Segue string

Page 135: Modular View Controller Hierarchies

Storyboard

On Cell Selection…TableViewController.swiftoverride func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

Match Segue string

Cast new VC

Set up new VC

Page 136: Modular View Controller Hierarchies

Storyboard

On Cell Selection…TableViewController.swiftoverride func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

Match Segue string

Cast new VC

Set up new VC

Table VC doesn’t know NewVC

Table VC only knows DetailVC

Page 137: Modular View Controller Hierarchies

COUPLED CONTENT View controllers!

Page 138: Modular View Controller Hierarchies

Isolate content view controllers

Page 139: Modular View Controller Hierarchies

What are we losing?

• Ability to

• re-order content view controllers

• reuse content view controllers

Page 140: Modular View Controller Hierarchies

Next day…

Page 141: Modular View Controller Hierarchies

Jiles comes in looking like he was hit by a

train and mauled by some cats.

Page 142: Modular View Controller Hierarchies
Page 143: Modular View Controller Hierarchies

Jiles delivers, but is exhausted

Page 144: Modular View Controller Hierarchies

Jiles thinks...

Page 145: Modular View Controller Hierarchies

he should be able to move this list anywhere in the app, and it should just

work!

Page 146: Modular View Controller Hierarchies

Jiles thinks...

Page 147: Modular View Controller Hierarchies

View controllers should be able to live on their own. They should not depend on the container they are in

Page 148: Modular View Controller Hierarchies

and they should not depend on sibling

content controllers.

Page 149: Modular View Controller Hierarchies

Sometime in the Future...

Page 150: Modular View Controller Hierarchies
Page 151: Modular View Controller Hierarchies

Jiles goes to WWDC in search of a better view controller architecture

Page 152: Modular View Controller Hierarchies

Jiles meets John in line for the

keynote

Page 153: Modular View Controller Hierarchies
Page 154: Modular View Controller Hierarchies

John asks, “how’s it going, how

was your last project?”

Page 155: Modular View Controller Hierarchies
Page 156: Modular View Controller Hierarchies

Jiles explains the problems he faced,

Page 157: Modular View Controller Hierarchies

he tells John, “there must be a better way!”

Page 158: Modular View Controller Hierarchies

John has experienced the exact same

problems as Jiles

Page 159: Modular View Controller Hierarchies

John says, "I've found a better way"

Page 160: Modular View Controller Hierarchies

Jiles is happy... and eager to learn more!

Page 161: Modular View Controller Hierarchies
Page 162: Modular View Controller Hierarchies

John starts explaining…

Page 163: Modular View Controller Hierarchies

So where should logic go?

Page 164: Modular View Controller Hierarchies

So where should logic go?Can’t go here

Page 165: Modular View Controller Hierarchies

So where should logic go?Can’t go here

Page 166: Modular View Controller Hierarchies

So where should logic go?Can’t go here

Page 167: Modular View Controller Hierarchies

So where?

Page 168: Modular View Controller Hierarchies

So where should logic go?

Navigation View Controller

Page 169: Modular View Controller Hierarchies

So where should logic go?Navigation View Controller

Page 170: Modular View Controller Hierarchies

So where should logic go?Navigation View Controller why not here?

Page 171: Modular View Controller Hierarchies

So where should logic go?

UINavigationController IS

a container view controller

Page 172: Modular View Controller Hierarchies

Subclassing isn’t always

evil

Page 173: Modular View Controller Hierarchies

How would this work?

Page 174: Modular View Controller Hierarchies

Content View Controllers

Page 175: Modular View Controller Hierarchies

Think of as async task

Page 176: Modular View Controller Hierarchies

Inputs and Outcomes

Page 177: Modular View Controller Hierarchies

Inputs and Outcomes

After init, provide input

Page 178: Modular View Controller Hierarchies

Inputs and Outcomes

When finished, report outcome

Page 179: Modular View Controller Hierarchies

Input

• Either

• initializer arguments

• public variable properties

Page 180: Modular View Controller Hierarchies

Outcome

• Either

• onComplete closure (selectedId: String)->()

• leverage targetViewControllerForAction

Page 181: Modular View Controller Hierarchies

class TableViewController: UITableViewController { // Input var userId: String? // Outcome var onComplete: ((selectedId: String)->())? }

Input-Outcome Based VC

Page 182: Modular View Controller Hierarchies

// Inside Container View Controller...

let tableVC = TableViewController(style: .Plain) tableVC.userId = loggedInUserId tableVC.onComplete = { selectedId in // Container VC decides where to go next }

Container’s Usage

Page 183: Modular View Controller Hierarchies

Back to our navigation controller…

Page 184: Modular View Controller Hierarchies

On App Launch

Page 185: Modular View Controller Hierarchies

Creates HomeVCMyNavigationController.swiftlet homeVC = HomeVC()

Page 186: Modular View Controller Hierarchies

Creates HomeVCMyNavigationController.swiftlet homeVC = HomeVC()

Page 187: Modular View Controller Hierarchies

Pushes HomeVCMyNavigationController.swiftpushViewController(homeVC, animated: false))

Page 188: Modular View Controller Hierarchies

On User Interaction… HomeViewController.swiftonComplete()

Page 189: Modular View Controller Hierarchies

On User Interaction… MyNavigationController.swiftlet tableVC = TableViewController()

Nav controller manages content view controllers

Page 190: Modular View Controller Hierarchies

On User Interaction… MyNavigationController.swiftlet tableVC = TableViewController()

Nav controller manages content view controllers

Page 191: Modular View Controller Hierarchies

On User Interaction… MyNavigationController.swiftpushViewController(tableVC, animated: true)

Page 192: Modular View Controller Hierarchies

On Cell SelectionTableViewController.swiftfunc tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

Page 193: Modular View Controller Hierarchies

On Cell SelectionTableViewController.swiftonComplete(selectedId: viewModelObject.id)

Page 194: Modular View Controller Hierarchies

On Cell SelectionMyNavigationController.swiftlet detailVC = DetailViewController(modelId: selectedId)

Page 195: Modular View Controller Hierarchies

On Cell SelectionMyNavigationController.swiftlet detailVC = DetailViewController(modelId: selectedId)

Page 196: Modular View Controller Hierarchies

On Cell SelectionMyNavigationController.swiftlet detailVC = DetailViewController(modelId: selectedId)

Page 197: Modular View Controller Hierarchies

On Cell SelectionMyNavigationController.swiftpushViewController(detailVC, animated: true)

Page 198: Modular View Controller Hierarchies

Demo!

Page 199: Modular View Controller Hierarchies

Composition

Page 200: Modular View Controller Hierarchies
Page 201: Modular View Controller Hierarchies

Remember

Page 202: Modular View Controller Hierarchies

Dependencies

Content View Controllers should not depend on

• a specific container view controller class

• sibling content view controllers

Think of view controllers as lego blocks

Page 203: Modular View Controller Hierarchies

If you liked this, there’s more

Page 204: Modular View Controller Hierarchies

Elements

Page 205: Modular View Controller Hierarchies

Josh BerlinCollection View [email protected]

@jab2109

René CacheauxiOS [email protected]

[email protected]@RCachATX

Page 206: Modular View Controller Hierarchies