SlideShare une entreprise Scribd logo
1  sur  40
Télécharger pour lire hors ligne
Using view controllers
        wisely
    Samuel Défago,         le studio
            October 2011
Who am I?
• iOS developer at          le studio
  (www.hortis.ch)
• Mail: defagos (at) gmail (dot) com
• Twitter: @defagos
• Blog: http://subjective-objective-
  c.blogspot.com/
• Open-source: https://github.com/defagos
Motivations

• VCs are fundamental iOS objects, ...
• ... are used and implemented every day...
• ... but are often misused and abused
• When correctly used, they lead to more
  reliable applications and superior code
Goals

• Learn how to organize VCs in applications
• Understand how to use containers


• Avoid common pitfalls and errors
Misused? Abused?
• Messy implementation
• Incorrect resource management
• Often only slightly superior to Xcode
  templates (i.e. slightly superior to void)
• Poor separation of concerns, big balls of
  mud
• Monolithic application workflow
yep,here

               Topics
                         Havealookinthecorner
                         toknowwhichtopicwe
                                   aretalkingabout


• Overview of view controllers  containers
• Using view controllers in an application
• Anatomy of containers
What is a view
         controller?
• is a controller: Bi-directional
  communication channel between view and
  model (MVC)
• has a view:View hierarchy management
  (lifecycle, orientation, low-memory
  conditions)
• Manages the content of one screen or of
  one part of a screen
• Subclass to create custom view controllers
What is a container?
• Is an object managing a set of view
  controllers
• In general used as-is, not meant to be
  subclassed
• Helps managing the view controller
  hierarchy, i.e. the application workflow...
• ... but only the workflow it implements
UINavigationController




• Navigation bar at the top
• Push from right / left animations only
UITabBarController



• Tabs at the bottom
• Must be application root VC or root in
  modal
Criticism
• Few built-in containers...
• ... i.e. few well-supported workflows
  (navigation, tabs, modal, split content)
• This is annoying on iPad (emphasis on
  creative interfaces, use of both hands), less
  on iPhone (skinned interfaces, one hand
  usually suffices)
An iPad shopping
        application
• Application to buy items from some online
  store on the iPad
• Three people involved:
 • Product owner: Requirements
 • UI / UX designer: Design  interaction
 • Programmer: Write the application
Product owner

• “I want the customer to be able to browse
  products and their descriptions”
• “I want the customer to be able to add
  items to its cart”
• “I want the customer to be able to access
  its cart and to submit an order”
UI / UX designer (1)
UI / UX designer (2)
Programmer:VCs
ShoppingViewController

                                                    Product-
    ProductList-
                                                 ViewController
    ViewController


ShoppingViewController                     ShoppingViewController


    CartItemList-         Stayin     BillingInformation-
    ViewController       carttab        ViewController
Programmer: Workflow
                           retains VC and
                          addSubview:
ShoppingViewController                          ProductListViewController
                                                                                   presentModalViewController:
            showShop:                                            showDetails:               animated:

            showCart:         retains VC and                                                         ProductViewController
                             addSubview:
            checkout:
                                                                                                                    close:
                                               CartItemListViewController
           goBackwards:
                                                                                                        dismissModalViewController
                                                                showDetails:                                    Animated:
                                                                                presentModalViewController:
                                                                 checkout:               animated:




                                               BillingInformationViewController
                           retains VC and
                          addSubview:
                                                                    submitOrder:

                                                                    goBackwards:


                                                                                                                     IBAction
Demo
Criticism

• No transparency when displaying product
  details
• ShoppingViewController manages almost
  all application workflow
• Seems to work, but does it REALLY work?
Analyzing the shopping
      application
• Use VCs logging all lifecycle and rotation
  events
• Navigate the application
• Rotate the device
• Simulate memory warnings
• Check the logs
Log archaeology (1)

• Click on Shop tab, then on Cart tab:


• Show product details
Log archaeology (2)
                           retains VC and
                          addSubview:
ShoppingViewController                          ProductListViewController
                                                                                   presentModalViewController:
            showShop:                                            showDetails:               animated:

            showCart:         retains VC and                                                         ProductViewController
                             addSubview:
            checkout:
                                                                                                                      close:
                                               CartItemListViewController
           goBackwards:
                                                                                                        dismissModalViewController
                                                                showDetails:                                    Animated:
                                                                                presentModalViewController:
                                                                 checkout:               animated:




                                               BillingInformationViewController
                           retains VC and
                          addSubview:
                                                                    submitOrder:
                                                                                                   View lifecycle and rotation OK
                                                                    goBackwards:


                                                                                                   View lifecycle and rotation KO
Conclusion
• Creating a view controllers hierarchy using
  addSubview:   leads to incorrect behavior
• View lifecycle and rotation events are not
  emitted automagically
• The root and modal view controllers have a
  proper behavior

      Always use containers to manage your
      view controller hierarchy
Custom containers

• Custom containers are needed for more
  creative workflows
• Using custom containers must be easy...
• ... but writing custom containers is hard
Elementary containers
• Writing containers is hard...
• ... so write few correct elementary
  containers...
• ... and combine them to create new
  workflows...
• ... or even new containers!
Placeholders
• Embed some other view controllers
• Display VCs simultaneously
• Can display other UI elements
                     VC1             VC1
  VC1
                                              VC3
                         VC2         VC2
 1-placeholder       2-placeholder    3-placeholder
Stack
• Manage a stack of view controllers
• Usually only display the top VC
• Fill the whole view, no other UI elements

                   VC4
                   VC1
                    VC1
                    VC1
Combinations (1)


     VC1
                = custom UITabBarController




1-placeholder
Combinations (2)

                   +          VC4
                              VC1
                               VC1
                               VC1

     VC1
                               stack




1-placeholder   = custom UINavigationController
Combinations (3)


VC1                   VC2




      2-placeholder



             = resizable UISplitViewController
Implementation

• CoconutKit (https://github.com/defagos/
  CoconutKit):
  • HLSPlaceholderViewController
  • HLSStackController
• Technical details: http://subjective-objective-
  c.blogspot.com/2011/08/writing-high-
  quality-view-controller.html
Demo
iShopping revisited
ShoppingViewController(PH)

                                     stack                  Product-
       ProductList-
                                                         ViewController
       ViewController


ShoppingViewController(PH)           ShoppingViewController(PH)


       CartItemList-                               BillingInformation-
                                     stack            ViewController
       ViewController
Buggy workflow
                           retains VC and
                          addSubview:
ShoppingViewController                          ProductListViewController
                                                                                   presentModalViewController:
            showShop:                                            showDetails:               animated:

            showCart:         retains VC and                                                         ProductViewController
                             addSubview:
            checkout:
                                                                                                                    close:
                                               CartItemListViewController
           goBackwards:
                                                                                                        dismissModalViewController
                                                                showDetails:                                    Animated:
                                                                                presentModalViewController:
                                                                 checkout:               animated:




                                               BillingInformationViewController
                           retains VC and
                          addSubview:
                                                                    submitOrder:

                                                                    goBackwards:
Fixed workflow
  ShoppingViewController
 (stack root  placeholder)                     ProductListViewController
                                                                                pushViewController:
               showShop:                                         showDetails:
                              setInsetViewController:
                  showCart:                                                                        ProductViewController

                                                             pushViewController:                                     close:

                                                                                                            popViewController:

                                                                 §
                                            CartItemListViewController
                                                    (stack root)
                                                            showDetails:

                                                             checkout:                 BillingInformationViewController
                                                                   pushViewController:
                                                                                                            submitOrder:

                                                                                                            goBackwards:

                                         StackController                                                popViewController:
StackController
Demo
Log archaeology

• Click on Cart tab when on Shop tab:


• Show product details
Summary

• Never ever display a view controller by
  adding its view as subview directly
• Design your view controller workflow, and
  manage it using view controller containers
• Use the view controller lifecycle correctly
  to insert your code where most
  appropriate
Thanks for your
   attention
Questions?

Contenu connexe

Similaire à Using view controllers wisely

아이폰강의(5) pdf
아이폰강의(5) pdf아이폰강의(5) pdf
아이폰강의(5) pdf
sunwooindia
 
storyboard時代のInterfaceBuilder
storyboard時代のInterfaceBuilderstoryboard時代のInterfaceBuilder
storyboard時代のInterfaceBuilder
Hiroyuki Fujikawa
 

Similaire à Using view controllers wisely (20)

Creating Container View Controllers
Creating Container View ControllersCreating Container View Controllers
Creating Container View Controllers
 
From mvc to viper
From mvc to viperFrom mvc to viper
From mvc to viper
 
Mvc architecture
Mvc architectureMvc architecture
Mvc architecture
 
아이폰강의(5) pdf
아이폰강의(5) pdf아이폰강의(5) pdf
아이폰강의(5) pdf
 
Intro to UIKit • Made by Many
Intro to UIKit • Made by ManyIntro to UIKit • Made by Many
Intro to UIKit • Made by Many
 
Icreate
IcreateIcreate
Icreate
 
storyboard時代のInterfaceBuilder
storyboard時代のInterfaceBuilderstoryboard時代のInterfaceBuilder
storyboard時代のInterfaceBuilder
 
Use case driven architecture
Use case driven architectureUse case driven architecture
Use case driven architecture
 
I os 11
I os 11I os 11
I os 11
 
iPhone Programming in 30 minutes (?) [FTS]
iPhone Programming in 30 minutes (?) [FTS]iPhone Programming in 30 minutes (?) [FTS]
iPhone Programming in 30 minutes (?) [FTS]
 
iOS_Presentation
iOS_PresentationiOS_Presentation
iOS_Presentation
 
Iphone course 3
Iphone course 3Iphone course 3
Iphone course 3
 
Design Patterns in ZK: Java MVVM as Model-View-Binder
Design Patterns in ZK: Java MVVM as Model-View-BinderDesign Patterns in ZK: Java MVVM as Model-View-Binder
Design Patterns in ZK: Java MVVM as Model-View-Binder
 
SwiftでUIKitDynamics
SwiftでUIKitDynamicsSwiftでUIKitDynamics
SwiftでUIKitDynamics
 
View controllers en iOS
View controllers en iOSView controllers en iOS
View controllers en iOS
 
iOS Design to Code - Code
iOS Design to Code - CodeiOS Design to Code - Code
iOS Design to Code - Code
 
iOS: View Controllers
iOS: View ControllersiOS: View Controllers
iOS: View Controllers
 
Class 02 Objective C
Class 02   Objective CClass 02   Objective C
Class 02 Objective C
 
MVVM in iOS presentation
MVVM in iOS presentationMVVM in iOS presentation
MVVM in iOS presentation
 
How I Accidentally Discovered MVVM
How I Accidentally Discovered MVVMHow I Accidentally Discovered MVVM
How I Accidentally Discovered MVVM
 

Dernier

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Dernier (20)

FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 

Using view controllers wisely

  • 1. Using view controllers wisely Samuel Défago, le studio October 2011
  • 2. Who am I? • iOS developer at le studio (www.hortis.ch) • Mail: defagos (at) gmail (dot) com • Twitter: @defagos • Blog: http://subjective-objective- c.blogspot.com/ • Open-source: https://github.com/defagos
  • 3. Motivations • VCs are fundamental iOS objects, ... • ... are used and implemented every day... • ... but are often misused and abused • When correctly used, they lead to more reliable applications and superior code
  • 4. Goals • Learn how to organize VCs in applications • Understand how to use containers • Avoid common pitfalls and errors
  • 5. Misused? Abused? • Messy implementation • Incorrect resource management • Often only slightly superior to Xcode templates (i.e. slightly superior to void) • Poor separation of concerns, big balls of mud • Monolithic application workflow
  • 6. yep,here Topics Havealookinthecorner toknowwhichtopicwe aretalkingabout • Overview of view controllers containers • Using view controllers in an application • Anatomy of containers
  • 7. What is a view controller? • is a controller: Bi-directional communication channel between view and model (MVC) • has a view:View hierarchy management (lifecycle, orientation, low-memory conditions) • Manages the content of one screen or of one part of a screen • Subclass to create custom view controllers
  • 8. What is a container? • Is an object managing a set of view controllers • In general used as-is, not meant to be subclassed • Helps managing the view controller hierarchy, i.e. the application workflow... • ... but only the workflow it implements
  • 9. UINavigationController • Navigation bar at the top • Push from right / left animations only
  • 10. UITabBarController • Tabs at the bottom • Must be application root VC or root in modal
  • 11. Criticism • Few built-in containers... • ... i.e. few well-supported workflows (navigation, tabs, modal, split content) • This is annoying on iPad (emphasis on creative interfaces, use of both hands), less on iPhone (skinned interfaces, one hand usually suffices)
  • 12. An iPad shopping application • Application to buy items from some online store on the iPad • Three people involved: • Product owner: Requirements • UI / UX designer: Design interaction • Programmer: Write the application
  • 13. Product owner • “I want the customer to be able to browse products and their descriptions” • “I want the customer to be able to add items to its cart” • “I want the customer to be able to access its cart and to submit an order”
  • 14. UI / UX designer (1)
  • 15. UI / UX designer (2)
  • 16. Programmer:VCs ShoppingViewController Product- ProductList- ViewController ViewController ShoppingViewController ShoppingViewController CartItemList- Stayin BillingInformation- ViewController carttab ViewController
  • 17. Programmer: Workflow retains VC and addSubview: ShoppingViewController ProductListViewController presentModalViewController: showShop: showDetails: animated: showCart: retains VC and ProductViewController addSubview: checkout: close: CartItemListViewController goBackwards: dismissModalViewController showDetails: Animated: presentModalViewController: checkout: animated: BillingInformationViewController retains VC and addSubview: submitOrder: goBackwards: IBAction
  • 18. Demo
  • 19. Criticism • No transparency when displaying product details • ShoppingViewController manages almost all application workflow • Seems to work, but does it REALLY work?
  • 20. Analyzing the shopping application • Use VCs logging all lifecycle and rotation events • Navigate the application • Rotate the device • Simulate memory warnings • Check the logs
  • 21. Log archaeology (1) • Click on Shop tab, then on Cart tab: • Show product details
  • 22. Log archaeology (2) retains VC and addSubview: ShoppingViewController ProductListViewController presentModalViewController: showShop: showDetails: animated: showCart: retains VC and ProductViewController addSubview: checkout: close: CartItemListViewController goBackwards: dismissModalViewController showDetails: Animated: presentModalViewController: checkout: animated: BillingInformationViewController retains VC and addSubview: submitOrder: View lifecycle and rotation OK goBackwards: View lifecycle and rotation KO
  • 23. Conclusion • Creating a view controllers hierarchy using addSubview: leads to incorrect behavior • View lifecycle and rotation events are not emitted automagically • The root and modal view controllers have a proper behavior Always use containers to manage your view controller hierarchy
  • 24. Custom containers • Custom containers are needed for more creative workflows • Using custom containers must be easy... • ... but writing custom containers is hard
  • 25. Elementary containers • Writing containers is hard... • ... so write few correct elementary containers... • ... and combine them to create new workflows... • ... or even new containers!
  • 26. Placeholders • Embed some other view controllers • Display VCs simultaneously • Can display other UI elements VC1 VC1 VC1 VC3 VC2 VC2 1-placeholder 2-placeholder 3-placeholder
  • 27. Stack • Manage a stack of view controllers • Usually only display the top VC • Fill the whole view, no other UI elements VC4 VC1 VC1 VC1
  • 28. Combinations (1) VC1 = custom UITabBarController 1-placeholder
  • 29. Combinations (2) + VC4 VC1 VC1 VC1 VC1 stack 1-placeholder = custom UINavigationController
  • 30. Combinations (3) VC1 VC2 2-placeholder = resizable UISplitViewController
  • 31. Implementation • CoconutKit (https://github.com/defagos/ CoconutKit): • HLSPlaceholderViewController • HLSStackController • Technical details: http://subjective-objective- c.blogspot.com/2011/08/writing-high- quality-view-controller.html
  • 32. Demo
  • 33. iShopping revisited ShoppingViewController(PH) stack Product- ProductList- ViewController ViewController ShoppingViewController(PH) ShoppingViewController(PH) CartItemList- BillingInformation- stack ViewController ViewController
  • 34. Buggy workflow retains VC and addSubview: ShoppingViewController ProductListViewController presentModalViewController: showShop: showDetails: animated: showCart: retains VC and ProductViewController addSubview: checkout: close: CartItemListViewController goBackwards: dismissModalViewController showDetails: Animated: presentModalViewController: checkout: animated: BillingInformationViewController retains VC and addSubview: submitOrder: goBackwards:
  • 35. Fixed workflow ShoppingViewController (stack root placeholder) ProductListViewController pushViewController: showShop: showDetails: setInsetViewController: showCart: ProductViewController pushViewController: close: popViewController: § CartItemListViewController (stack root) showDetails: checkout: BillingInformationViewController pushViewController: submitOrder: goBackwards: StackController popViewController: StackController
  • 36. Demo
  • 37. Log archaeology • Click on Cart tab when on Shop tab: • Show product details
  • 38. Summary • Never ever display a view controller by adding its view as subview directly • Design your view controller workflow, and manage it using view controller containers • Use the view controller lifecycle correctly to insert your code where most appropriate
  • 39. Thanks for your attention