Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Schlanke View Controller

Schlanke View Controller

Vortrag bei der Macoun 2013

Ade0c334ecff1448bb96f5f733bf1f83?s=128

Chris Eidhof | @chriseidhof

October 05, 2013
Tweet

Transcript

  1. Macoun ⌘ Vorbereitung: 1. Demos, Files im Finder anordnen. 2.

    Alle Programme die man für Demos benötigt vorher(!) starten. Bpsw: Xcode, Terminal, Refelection. 3. Präsentation starten und auf Zeichen oder Signal warten. Samstag, 5. Oktober 13
  2. Schlanke View Controller Chris Eidhof Den Titel der Session und

    darunter den eigenen Namen eintragen. Logo links oben anstatt dem Platzhalter. Nur auf diesem Slide! Samstag, 5. Oktober 13
  3. WERBUNG Verkaufe Gouda im Wohnwagen Samstag, 5. Oktober 13

  4. UITabellenAnzeigerAbgeordnete Samstag, 5. Oktober 13

  5. Was ist die größte Datei in deinem Projekt? Samstag, 5.

    Oktober 13
  6. Was ist die größte Datei in deinem Projekt? 0 200

    400 600 800 Samstag, 5. Oktober 13
  7. (image by Manu Cornet) Samstag, 5. Oktober 13

  8. (image by Manu Cornet) Samstag, 5. Oktober 13

  9. View Controller sind nicht wiederverwendbar Samstag, 5. Oktober 13

  10. find . -name "*.m" -exec wc -l "{}" \; |

    sort -n Samstag, 5. Oktober 13
  11. 154 ./ViewControllers/THUserPrioritiesViewController.m 154 ./ViewControllers/THZoomingNavigationController.m 155 ./Extensions/NSArray+Extensions.m 155 ./Extensions/UIView+Extensions.m 168 ./Controllers/THPriorityTimelineCollectionController.m

    179 ./Controllers/THUserScreenInstancesController.m 183 ./ViewControllers/THRootViewController.m 183 ./ViewControllers/THScreenInstanceViewController.m 185 ./Model/User+Extensions.m 192 ./ViewControllers/THEditPriorityViewController.m 221 ./ViewControllers/THScreeningBarViewController.m 243 ./Views/THTimeLineView.m 263 ./ViewControllers/THCardsViewController.m 279 ./Views/THSkillboxView.m Samstag, 5. Oktober 13
  12. 154 ./ViewControllers/THUserPrioritiesViewController.m 154 ./ViewControllers/THZoomingNavigationController.m 155 ./Extensions/NSArray+Extensions.m 155 ./Extensions/UIView+Extensions.m 168 ./Controllers/THPriorityTimelineCollectionController.m

    179 ./Controllers/THUserScreenInstancesController.m 183 ./ViewControllers/THRootViewController.m 183 ./ViewControllers/THScreenInstanceViewController.m 185 ./Model/User+Extensions.m 192 ./ViewControllers/THEditPriorityViewController.m 221 ./ViewControllers/THScreeningBarViewController.m 243 ./Views/THTimeLineView.m 263 ./ViewControllers/THCardsViewController.m 279 ./Views/THSkillboxView.m Samstag, 5. Oktober 13
  13. 512 ./Classes/LessonResultViewController.m 514 ./Classes/Libs/ASIHTTPRequest/ASIDownloadCache.m 598 ./Classes/MainViewController.m 605 ./Classes/GameStartViewController.m 803 ./Classes/ResultViewController.m

    818 ./Classes/RootViewController.m 1000 ./Classes/RankingViewController.m 1465 ./Classes/QuestionViewController.m 1590 ./Classes/REDACTEDAppDelegate.m 5125 ./Classes/Libs/ASIHTTPRequest/ASIHTTPRequest.m Samstag, 5. Oktober 13
  14. ... na gut, aber das ist ein wichtiger View Controller...

    Samstag, 5. Oktober 13
  15. STEPS Project Komplettes Betriebssystem in < 20K Zeilen Samstag, 5.

    Oktober 13
  16. Was können wir tun? Samstag, 5. Oktober 13

  17. Ein View Controller vermittelt zwischen Modell und View Samstag, 5.

    Oktober 13
  18. Modelllogik Samstag, 5. Oktober 13

  19. Viewlogik Samstag, 5. Oktober 13

  20. Layout Samstag, 5. Oktober 13

  21. Webservice Samstag, 5. Oktober 13

  22. View Controller Modell Child View Controller Webservice Samstag, 5. Oktober

    13
  23. Demo Samstag, 5. Oktober 13

  24. View Controller Modell Child View Controller Webservice Samstag, 5. Oktober

    13
  25. View Controller Modell Child View Controller Webservice Samstag, 5. Oktober

    13
  26. View Controller Modell Child View Controller Webservice Samstag, 5. Oktober

    13
  27. Modelllogik Entweder im Modell oder in einer separaten Klasse Samstag,

    5. Oktober 13
  28. 18 ./NestedTodoList/main.m 30 ./Item.m 31 ./NestedTodoList/Store.m 49 ./NestedTodoList/PersistentStack.m 52 ./NestedTodoList/AppDelegate.m

    255 ./NestedTodoList/ItemViewController.m Beispielprojekt Samstag, 5. Oktober 13
  29. 18 ./NestedTodoList/main.m 30 ./Item.m 31 ./NestedTodoList/Store.m 49 ./NestedTodoList/PersistentStack.m 52 ./NestedTodoList/AppDelegate.m

    255 ./NestedTodoList/ItemViewController.m Beispielprojekt Samstag, 5. Oktober 13
  30. Verantwortlichkeiten •Views konfigurieren •Table View Delegate •Table View Datasource •Fetched

    Results Controller Delegate •Items hinzufügen •Items löschen Samstag, 5. Oktober 13
  31. } Separate Klasse Verantwortlichkeiten •Views konfigurieren •Table View Delegate •Table

    View Datasource •Fetched Results Controller Delegate •Items hinzufügen •Items löschen Samstag, 5. Oktober 13
  32. } Separate Klasse Verantwortlichkeiten •Views konfigurieren •Table View Delegate •Table

    View Datasource •Fetched Results Controller Delegate •Items hinzufügen •Items löschen } Modell Samstag, 5. Oktober 13
  33. - (BOOL)textFieldShouldReturn:(UITextField*)t { NSString* title = t.text; NSUInteger order =

    self.parent.children.count; Item* item = [NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:self.moc]; item.title = title; item.parent = self.parent; item.order = @(order); ... } Modell Samstag, 5. Oktober 13
  34. - (BOOL)textFieldShouldReturn:(UITextField*)t { NSString* title = t.text; NSUInteger order =

    self.parent.children.count; [Item insertItemWithTitle:title parent:self.parent inManagedObjectContext:self.moc]; ... } Modell Samstag, 5. Oktober 13
  35. - (void)deleteItem:(id)object { Item* item = object; NSSet* siblings =

    item.parent.children; NSPredicate* predicate = [NSPredicate predicateWithFormat:@"order > %@", item.order]; NSSet* itemsAfterSelf = [siblings filteredSetUsingPredicate:predicate]; [itemsAfterSelf enumerateObjectsUsingBlock:^(Item* sibling, BOOL* stop) { sibling.order = @(sibling.order.integerValue - 1); }]; [item.moc deleteObject:item]; } Samstag, 5. Oktober 13
  36. - (void)deleteItem:(id)object { Item* item = object; NSSet* siblings =

    item.parent.children; NSPredicate* predicate = [NSPredicate predicateWithFormat:@"order > %@", item.order]; NSSet* itemsAfterSelf = [siblings filteredSetUsingPredicate:predicate]; [itemsAfterSelf enumerateObjectsUsingBlock:^(Item* sibling, BOOL* stop) { sibling.order = @(sibling.order.integerValue - 1); }]; [item.moc deleteObject:item]; } Samstag, 5. Oktober 13
  37. - (void)prepareForDeletion { NSSet* siblings = self.parent.children; NSPredicate* p =

    [NSPredicate predicateWithFormat:@"order > %@", self.order]; NSSet* itemsAfterSelf = [siblings filteredSetUsingPredicate:p]; [itemsAfterSelf enumerateObjectsUsingBlock: ^(Item* sibling, BOOL* stop) { sibling.order = @(sibling.order.integerValue - 1); }]; } Samstag, 5. Oktober 13
  38. 18 ./NestedTodoList/main.m 31 ./NestedTodoList/Store.m 49 ./NestedTodoList/PersistentStack.m 52 ./NestedTodoList/AppDelegate.m 54 ./Item.m

    241 ./NestedTodoList/ItemViewController.m Beispielprojekt Samstag, 5. Oktober 13
  39. 18 ./NestedTodoList/main.m 31 ./NestedTodoList/Store.m 49 ./NestedTodoList/PersistentStack.m 52 ./NestedTodoList/AppDelegate.m 54 ./Item.m

    241 ./NestedTodoList/ItemViewController.m Beispielprojekt Samstag, 5. Oktober 13
  40. View Controller Modell Child View Controller Webservice UITableViewDS Samstag, 5.

    Oktober 13
  41. View Controller Modell Child View Controller Webservice UITableViewDS Samstag, 5.

    Oktober 13
  42. @interface FetchedResultsControllerDataSource : NSObject <UITableViewDataSource, NSFetchedResultsControllerDelegate> Samstag, 5. Oktober 13

  43. - (NSInteger)numberOfSectionsInTableView:(UITableView*)t { return self.fetchedResultsController.sections.count; } Samstag, 5. Oktober 13

  44. - (NSInteger)tableView:(UITableView*)t numberOfRowsInSection:(NSInteger)s { id<NSFetchedResultsSectionInfo> section = self.fetchedResultsController.sections[s]; return section.numberOfObjects;

    } Samstag, 5. Oktober 13
  45. - (UITableViewCell*)tableView:(UITableView*)t cellForRowAtIndexPath:(NSIndexPath*)ip ? Samstag, 5. Oktober 13

  46. #pragma mark NSFetchedResultsControllerDelegate Samstag, 5. Oktober 13

  47. - (void)controller:(NSFetchedResultsController*)c didChangeObject:(id)anObject atIndexPath:(NSIndexPath*)indexPath forChangeType:(NSFetchedResultsChangeType)ct newIndexPath:(NSIndexPath*)newIndexPath Samstag, 5. Oktober 13

  48. @property (nonatomic, weak) id <FRCDataSourceDelegate> delegate; Samstag, 5. Oktober 13

  49. - (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath { id object = [self.frc objectAtIndexPath:indexPath]; id

    cell = [tableView dequeueReusableCellWithIdentifier:self.reuseIdentifier forIndexPath:indexPath]; [self.delegate configureCell:cell withObject:object]; return cell; } Samstag, 5. Oktober 13
  50. - (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath { id object = [self.frc objectAtIndexPath:indexPath]; id

    cell = [tableView dequeueReusableCellWithIdentifier:self.reuseIdentifier forIndexPath:indexPath]; [self.delegate configureCell:cell withObject:object]; return cell; } Samstag, 5. Oktober 13
  51. Demo Samstag, 5. Oktober 13

  52. 25 ./NestedTodoList/Store.m 49 ./NestedTodoList/PersistentStack.m 52 ./NestedTodoList/AppDelegate.m 64 ./Item.m 111 ./NestedTodoList/FRCDataSource.m

    162 ./NestedTodoList/ItemViewController.m Beispielprojekt Samstag, 5. Oktober 13
  53. 25 ./NestedTodoList/Store.m 49 ./NestedTodoList/PersistentStack.m 52 ./NestedTodoList/AppDelegate.m 64 ./Item.m 111 ./NestedTodoList/FRCDataSource.m

    162 ./NestedTodoList/ItemViewController.m Beispielprojekt Samstag, 5. Oktober 13
  54. Wiederverwendbarkeit Samstag, 5. Oktober 13

  55. Oder eine Oberklasse? Samstag, 5. Oktober 13

  56. Nachteile von Oberklassen Es gibt nur eine Oberklasse Schwerer zu

    wechseln, z.B. von UITableView nach UICollectionView Fehleranfälliger: z.B. super calls vergessen Samstag, 5. Oktober 13
  57. Andere Kandidaten UICollectionViewDataSource UIPageViewControllerDataSource UIPickerViewDataSource Samstag, 5. Oktober 13

  58. Mehr Kandidaten UICollectionViewDelegate UIScrollViewDelegate UITableViewDelegate UITableViewDelegate UITextFieldDelegate UINavigationControllerDelegate Samstag, 5.

    Oktober 13
  59. View Controller Modell Child View Controller Webservice Samstag, 5. Oktober

    13
  60. View Controller Modell Child View Controller Webservice Samstag, 5. Oktober

    13
  61. - (UITableViewCell*)tableView:(UITableView*)t cellForRowAtIndexPath:(NSIndexPath*)ip Samstag, 5. Oktober 13

  62. @interface PhotoCell (ConfigureForPhoto) - (void)configureForPhoto:(Photo *)photo; @end PhotoCell+ConfigureForPhoto.h Samstag, 5.

    Oktober 13
  63. UITableViewController •Löscht Selektion •Daten neu laden •Scroll indicators zeigen •Editieren

    •Scrollen zum first responder •Refresh control •.... Samstag, 5. Oktober 13
  64. Samstag, 5. Oktober 13

  65. View Controller Containment Samstag, 5. Oktober 13

  66. Samstag, 5. Oktober 13

  67. [self addChildViewController:sliderController]; [self.view addSubview:sliderController.view]; [UIView animateWithDuration:0.25 animations:^{ sliderController.view.alpha = 1;

    } completion:^(BOOL finished) { [sliderController didMoveToParentViewController:self]; }]; ... oder im Kode Samstag, 5. Oktober 13
  68. Kommunikation Samstag, 5. Oktober 13

  69. Kommunikation •Delegate •Blocks •KVO Samstag, 5. Oktober 13

  70. Kommunikation •Delegate •Blocks •KVO Zu viel? Samstag, 5. Oktober 13

  71. Interface Builder Samstag, 5. Oktober 13

  72. Samstag, 5. Oktober 13

  73. Samstag, 5. Oktober 13

  74. @interface MyCell : UITableViewCell @property (weak) IBOutlet UISlider *slider; @property

    (weak) IBOutlet UISwitch *switch; @end Samstag, 5. Oktober 13
  75. Benutzerdefinierte Objekte im Nib Samstag, 5. Oktober 13

  76. Samstag, 5. Oktober 13

  77. Samstag, 5. Oktober 13

  78. Samstag, 5. Oktober 13

  79. Outlets funktionieren auch Samstag, 5. Oktober 13

  80. @interface NSObject(UINibLoadingAdditions) - (void)awakeFromNib; @end Samstag, 5. Oktober 13

  81. Demo Samstag, 5. Oktober 13

  82. Testen Samstag, 5. Oktober 13

  83. Getrennte Data Source ✓ Samstag, 5. Oktober 13

  84. Kategorie für eine Zelle ✓ Samstag, 5. Oktober 13

  85. View Controller x Samstag, 5. Oktober 13

  86. - (void)testNibLoading; { id mockNavController = [self autoVerifiedMockForClass: [UINavigationController class]];

    PhotosViewController *photosViewController = [[PhotosViewController alloc] init]; id photosViewControllerMock = [self autoVerifiedPartialMockForObject: photosViewController]; [[[photosViewControllerMock stub] andReturn:mockNavController] navigationController]; Samstag, 5. Oktober 13
  87. Werkzeuge •Dateien nach Länge sortieren •Bibliothekenkenntniss •Refactoring: AppCode Samstag, 5.

    Oktober 13
  88. Werkzeuge •Data Source extrahieren •View Controller Containment •Mehr im Modell,

    mehr in Views Samstag, 5. Oktober 13
  89. Über mich •@chriseidhof •http://www.objc.io •http://www.uikonf.com •chris@eidhof.nlde Samstag, 5. Oktober 13

  90. Fragen? Samstag, 5. Oktober 13

  91. Vielen Dank Samstag, 5. Oktober 13

  92. Samstag, 5. Oktober 13

  93. Hier ist das Ende Letzte Folie Macoun ⌘ Samstag, 5.

    Oktober 13