Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Lighter View Controllers
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Chris Eidhof | @chriseidhof
February 18, 2014
Programming
500
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Lighter View Controllers
Talk at Cocoaheads.nl
(Architecture image by Manu Cornet)
Chris Eidhof | @chriseidhof
February 18, 2014
More Decks by Chris Eidhof | @chriseidhof
See All by Chris Eidhof | @chriseidhof
Dutch FP Day 2015
chriseidhof
2
410
Tiny Networking in Swift
chriseidhof
2
19k
Functional Swift - Brooklyn
chriseidhof
3
1.3k
Functional Swift - SF
chriseidhof
6
26k
Functional Swift
chriseidhof
6
1.3k
Functional Swift
chriseidhof
1
180
Functional Programming in Swift
chriseidhof
40
19k
Lighter View Controllers
chriseidhof
4
220
Parsing with Blocks
chriseidhof
2
270
Other Decks in Programming
See All in Programming
Verilogで学ぶCPU自作入門.pdf
uyuki234
8
3.6k
Are APIs Still Relevant in the AI Era?
soyuka
0
320
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2.4k
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2.2k
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
350
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
590
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
310
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
260
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
200
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
2
300
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
220
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
580
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
100
6.3k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
680
Heart Work Chapter 1 - Part 1
lfama
PRO
10
36k
Being A Developer After 40
akosma
91
590k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
250
ラッコキーワード サービス紹介資料
rakko
1
5M
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.3k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
420
Exploring anti-patterns in Rails
aemeredith
4
510
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Are puppies a ranking factor?
jonoalderson
2
3.9k
Transcript
Lighter View Controllers Chris Eidhof CocoaHeads NL
MVC Model View Controller
MVC Model View Controller Massive View Controller
None
What's the largest file? find . -name "*.m" -exec wc
-l "{}" \; | sort -n
Steps Project: A complete OS in < 20K lines
View Controllers are the least reusable part
A view controller intermediates between model and view
Model logic
View logic
View layout
Web Service
Too much already?
Delegates
IBActions ?
Pragma marks ??
None
Child View Controllers
Table View Controllers ☆ Editing Mode ☆ Keyboard notifications ☆
Flashing scroll indicators ☆ Clearing Selection ☆ Pull to Refresh
None
None
View Controller Transitions
None
Pulling out protocols
For example: UITableViewDataSource
Creating a separate data source object @interface FetchedResultsControllerDataSource : NSObject
<UITableViewDataSource, NSFetchedResultsControllerDelegate>
Creating a separate data source object - (NSInteger)numberOfSectionsInTableView:(UITableView*)t { return
self.fetchedResultsController.sections.count; }
Creating a separate data source object - (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)sectionIndex {
id<NSFetchedResultsSectionInfo> section; section = self.frc.sections[sectionIndex]; return section.numberOfObjects; }
Creating a separate data source object Working with the delegate
- (UITableViewCell*)tableView:(UITableView*)tv cellForRowAtIndexPath:(NSIndexPath*)ip { id object = [self objectAtIndexPath:indexPath]; id cell = [tv dequeueReusableCellWithIdentifier:ruI forIndexPath:ip]; [self.delegate configureCell:cell withObject:object]; return cell; }
Advantages of a separate data source ☆ Lighter view controller
☆ Testable ☆ Reusable And you can do this for other protocols, too...
A separate data source ☆ NSArrayDataSource ☆ NSFRCollectionViewController ☆ ...
Categories
Configuring a cell - (UITableViewCell*)tableView:(UITableView*)tv cellForRowAtIndexPath:(NSIndexPath*)ip { PhotoCell *cell =
[tableView dequeueReusableCellWithIdentifier:@"PhotoCell"]; Photo *photo = [self itemAtIndexPath:indexPath]; cell.photoTitleLabel.text = photo.name; NSString* date = [self.dateFormatter stringFromDate:photo.creationDate]; cell.photoDateLabel.text = date; }
Configuring a cell Pulling out the reusable part @implementation PhotoCell
(ConfigureForPhoto) - (void)configureForPhoto:(Photo *)photo { self.photoTitleLabel.text = photo.name; NSString* date = [self.dateFormatter stringFromDate:photo.creationDate]; self.photoDateLabel.text = date; } @end
Configuring a cell The refactored delegate method - (UITableViewCell *)tableView:(UITableView
*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { PhotoCell *cell = [tableView dequeueReusableCellWithIdentifier:PhotoCellIdentifier]; [cell configureForPhoto:[self itemAtIndexPath:indexPath]]; return cell; }
Using Interface Builder
None
Intentions
Intentions View Controllers may only contain code that effects view
changes in response to data changes. Source: http://bendyworks.com/geekville/articles/ 2014/2/single-responsibility-principle-ios
Intentions The IBAction macro must not be used in a
View Controller
Intentions The @interface block in a View Controller's header file
must be blank.
Intentions A View Controller may not implement any extra *Delegate
or *DataSource protocols except for observing Model changes.
Intentions A View Controller may only do work in viewDidLoad
(or awakeFromNib), viewDidAppear, viewDidDisappear, and in response to an observed change in the model layer.
None
Testing
Testing View controllers are notoriously hard to test → Make
them light.
Commercial Break
None
None
Questions? @chriseidhof