Avoiding oversized
 view controllers
      in iOS

 Stewart Gleadow
 Email:
 sgleadow@thoughtworks.com

 Twitter:
 @stewgleadow
What makes a class
easy to maintain?
UIView


UIViewController


                   Model
What makes a
controller easy to
    maintain?
UIViewController

- (id)init;

-   (void)loadView;
-   (void)viewDidLoad;
-   (void)viewWillAppear:(BOOL);
-   (void)viewDidAppear:(BOOL);

- (void)viewWillDisappear:(BOOL);
- (void)viewDidDisappear: (BOOL);
- (void)viewDidUnload;

- (void)dealloc;
UIViewController

- (id)init;

-   (void)loadView;
-   (void)viewDidLoad;
-   (void)viewWillAppear:(BOOL);
-   (void)viewDidAppear:(BOOL);

- (void)viewWillDisappear:(BOOL);
- (void)viewDidDisappear: (BOOL);
- (void)viewDidUnload;

- (void)dealloc;
UIViewController

- (id)init;

-   (void)loadView;
-   (void)viewDidLoad;
-   (void)viewWillAppear:(BOOL);
-   (void)viewDidAppear:(BOOL);

- (void)viewWillDisappear:(BOOL);
- (void)viewDidDisappear: (BOOL);
- (void)viewDidUnload;

- (void)dealloc;
- (id)init;
{
  if ((self = [super init]))
  {
    // create data related objects
  }

    return self;
}

- (void)dealloc;
{
  // release any data related objects

    [super dealloc];
}
- (void)loadView;
{
  [super loadView];

    // create all your views

    // assign delegates
}

- (void)viewDidUnload;
{
  // release any view related

    [super viewDidUnload];
}
@interface MatchViewController : UIViewController

  <UITableViewDelegate,
  UITableViewDataSource,
  UIScrollViewDelegate,
  TTModelDelegate,
  ...>
Coordinated Views

       View One



       View Two




       View Three
Coordinator

- (id)init;

- (UIView *)view;
- (void)releaseView;

- (void)dealloc;
ViewController               Coordinator

- (id)init;                         - (id)init;

-   (void)loadView;                 - (UIView *)view;
-   (void)viewDidLoad;              - (void)releaseView;
-   (void)viewWillAppear:(BOOL);
-   (void)viewDidAppear:(BOOL);     - (void)dealloc;

- (void)viewWillDisappear:(BOOL);
- (void)viewDidDisappear: (BOOL);
- (void)viewDidUnload;

- (void)dealloc;
ViewController               Coordinator

- (id)init;                         - (id)init;

-   (void)loadView;                 - (UIView *)view;
-   (void)viewDidLoad;              - (void)releaseView;
-   (void)viewWillAppear:(BOOL);
-   (void)viewDidAppear:(BOOL);     - (void)dealloc;

- (void)viewWillDisappear:(BOOL);
- (void)viewDidDisappear: (BOOL);
- (void)viewDidUnload;

- (void)dealloc;
ViewController               Coordinator

- (id)init;                         - (id)init;

-   (void)loadView;                 - (UIView *)view;
-   (void)viewDidLoad;              - (void)releaseView;
-   (void)viewWillAppear:(BOOL);
-   (void)viewDidAppear:(BOOL);     - (void)dealloc;

- (void)viewWillDisappear:(BOOL);
- (void)viewDidDisappear: (BOOL);
- (void)viewDidUnload;

- (void)dealloc;
Demo
Stewart Gleadow
Email:
sgleadow@thoughtworks.com

Twitter:
@stewgleadow

iOS View Coordinators

  • 1.
    Avoiding oversized viewcontrollers in iOS Stewart Gleadow Email: sgleadow@thoughtworks.com Twitter: @stewgleadow
  • 3.
    What makes aclass easy to maintain?
  • 4.
  • 6.
    What makes a controllereasy to maintain?
  • 9.
    UIViewController - (id)init; - (void)loadView; - (void)viewDidLoad; - (void)viewWillAppear:(BOOL); - (void)viewDidAppear:(BOOL); - (void)viewWillDisappear:(BOOL); - (void)viewDidDisappear: (BOOL); - (void)viewDidUnload; - (void)dealloc;
  • 10.
    UIViewController - (id)init; - (void)loadView; - (void)viewDidLoad; - (void)viewWillAppear:(BOOL); - (void)viewDidAppear:(BOOL); - (void)viewWillDisappear:(BOOL); - (void)viewDidDisappear: (BOOL); - (void)viewDidUnload; - (void)dealloc;
  • 11.
    UIViewController - (id)init; - (void)loadView; - (void)viewDidLoad; - (void)viewWillAppear:(BOOL); - (void)viewDidAppear:(BOOL); - (void)viewWillDisappear:(BOOL); - (void)viewDidDisappear: (BOOL); - (void)viewDidUnload; - (void)dealloc;
  • 13.
    - (id)init; { if ((self = [super init])) { // create data related objects } return self; } - (void)dealloc; { // release any data related objects [super dealloc]; }
  • 15.
    - (void)loadView; { [super loadView]; // create all your views // assign delegates } - (void)viewDidUnload; { // release any view related [super viewDidUnload]; }
  • 17.
    @interface MatchViewController :UIViewController <UITableViewDelegate, UITableViewDataSource, UIScrollViewDelegate, TTModelDelegate, ...>
  • 18.
    Coordinated Views View One View Two View Three
  • 19.
    Coordinator - (id)init; - (UIView*)view; - (void)releaseView; - (void)dealloc;
  • 21.
    ViewController Coordinator - (id)init; - (id)init; - (void)loadView; - (UIView *)view; - (void)viewDidLoad; - (void)releaseView; - (void)viewWillAppear:(BOOL); - (void)viewDidAppear:(BOOL); - (void)dealloc; - (void)viewWillDisappear:(BOOL); - (void)viewDidDisappear: (BOOL); - (void)viewDidUnload; - (void)dealloc;
  • 22.
    ViewController Coordinator - (id)init; - (id)init; - (void)loadView; - (UIView *)view; - (void)viewDidLoad; - (void)releaseView; - (void)viewWillAppear:(BOOL); - (void)viewDidAppear:(BOOL); - (void)dealloc; - (void)viewWillDisappear:(BOOL); - (void)viewDidDisappear: (BOOL); - (void)viewDidUnload; - (void)dealloc;
  • 23.
    ViewController Coordinator - (id)init; - (id)init; - (void)loadView; - (UIView *)view; - (void)viewDidLoad; - (void)releaseView; - (void)viewWillAppear:(BOOL); - (void)viewDidAppear:(BOOL); - (void)dealloc; - (void)viewWillDisappear:(BOOL); - (void)viewDidDisappear: (BOOL); - (void)viewDidUnload; - (void)dealloc;
  • 24.
  • 25.

Editor's Notes

  • #2 \n
  • #3 \n
  • #4 \n
  • #5 - small classes\n- small methods\n- single responsibility\n- not much logic, just decoupling\n
  • #6 - nav controller push/pop\n- low memory conditions (recycle the views)\n\n
  • #7 - nav controller push/pop\n- low memory conditions (recycle the views)\n\n
  • #8 \n
  • #9 \n
  • #10 \n
  • #11 \n
  • #12 - one UIViewController to rule them all (single responsibility?)\n- sub UIViewControllers: complicated lifecycle\n- custom UIView subclasses shouldn&amp;#x2019;t have delegate callbacks\n
  • #13 - automatic layout in full width horizontal\n- independent sections of the screen\n
  • #14 - simplified view controller\n- managed the creation of the view (holds it)\n- hides callbacks (can&amp;#x2019;t use UIView for that)\n
  • #15 - same object lifecycle, for delegate callbacks\n- simpler view lifecycle\n- automatic layout using stacked view\n
  • #16 - same object lifecycle, for delegate callbacks\n- simpler view lifecycle\n- automatic layout using stacked view\n
  • #17 - same object lifecycle, for delegate callbacks\n- simpler view lifecycle\n- automatic layout using stacked view\n
  • #18 - same object lifecycle, for delegate callbacks\n- simpler view lifecycle\n- automatic layout using stacked view\n
  • #19 - same object lifecycle, for delegate callbacks\n- simpler view lifecycle\n- automatic layout using stacked view\n
  • #20 - same object lifecycle, for delegate callbacks\n- simpler view lifecycle\n- automatic layout using stacked view\n
  • #21 - same object lifecycle, for delegate callbacks\n- simpler view lifecycle\n- automatic layout using stacked view\n
  • #22 - same object lifecycle, for delegate callbacks\n- simpler view lifecycle\n- automatic layout using stacked view\n
  • #23 \n
  • #24 \n