-
Notifications
You must be signed in to change notification settings - Fork 4
/
notes.html
605 lines (371 loc) · 11.2 KB
/
notes.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
<!DOCTYPE html>
<html>
<head>
<title>iOS-kurs</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<script src="https://github.com/downloads/gnab/remark/remark-0.3.4.min.js" type="text/javascript"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
<script src="https://github.com/downloads/kjbekkelund/remark-bekk/bekk-0.0.3.js" type="text/javascript"></script>
<link href="https://github.com/downloads/kjbekkelund/remark-bekk/bekk-0.0.3.css" type="text/css" rel="stylesheet">
<style>
.max-width img {
width: 100%;
}
.max-height img {
height: 100%;
}
</style>
</head>
<body>
<textarea id="source">
# Forslag til beskrivelse
---
.front-page
# iOS-kurs
---
# Tredelt kurs
Gå gjennom planen for kvelden og de neste kveldene.
---
# Hvem er vi?
- HANS MAGNUS INDERBERG
- BENDIK SOLHEIM
- OLE CHRISTIAN LANGFJÆRAN
- EIVIND BERGSTØL
- (HANS-CHRISTIAN FJELDBERG)
---
.middle.center
# Del 1
---
.agenda
# Agenda
---
.middle.center
# Objective-C
---
# Hva er Objective-C?
---
# C på så få minutter som mulig
---
# Objective-C Klasser og Objekter
---
# Objective-C ivar
---
# Klasse- og instansmetoder
---
# Objective-C Message Passing #1
---
# Objective-C Message Passing #2
---
# Terminologi
---
# Objective-C ivar og properties #1
---
# Objective-C ivar og properties #2
---
# Dot Syntax
---
# Dynamisk eller statisk?
* Stjerne viser at variabelen er en peker til en plass i minnet.
* Variabelen inneholder altså ikke data, men peker til data i minnet
* Forklare litt hva dynamisk og statisk er
* statisk typing (feks java) vs dynamisk typing (feks javascript)
* id kan implisitt kastes til hvilken som helst klasse
---
# Nil
* nil brukes som nullverdi for id eller objekter
* null brukes som nullverdi for alt annet
* Siden man ikke kaller funksjoner, men sender beskjeder, kan man fint sende beskjed til nil
* I mange språk får man NullPointerExceptions, ikke i Objective C!
* Ha dette litt i bakhodet - det kan gi deg litt interessante resultater
* De har samm verdi, men brukes altså i forskjellige sammenhenger
* Kanskje ikke anbefalt å bruke `0` though..
---
# Objective-C Minnehåndtering (bye bye)
* Forklare litt raskt reglene
* Forklare at det er en retaincount - antall som bruker objektet
* retain når man oppretter eller tar i bruk
* release når man er ferdig med objektet
* Garbage collection - ligner på Java sin, droppes i Mountain Lion til fordel for ARC og finnes ikke i iOS
* Apple har alltid vær litt imot GC, spesielt mobil som har begrensede ressurser
* Har alltid fått en del kritikk for MRC - enter ARC
* ARC - kompileren setter selv inn release / retain
* Implementerer reglene for minnehåndtering i kompilatoren
*
* Properties - du må spesifisere weak / strong for å si om klassen din skal styre minnet til variabelen
---
# Et eksempel (header *.h)
* Ikke bland @interface med interfaces fra feks Java
* Arver fra NSObject
* Ingen ivars deklarert, lages automatisk fra propertiene
* Spørsmål?
---
# Et eksempel (implementation *.m)
* privat metode betyr ikke at man ikke kan kalle metoden, man vil bare få en warning om at metoden kanskje ikke finnes.
---
.middle.center
# En liten pause?
---
.middle.center
# Introduksjon iOS
---
# iOS familien
* iPhone
* iPad
* iPod touch
* Apple TV special case
* Airplay: kan streame skjermbildet ditt til Apple TV
* DVS ferdige med kurset og sykt pro i iOS -> lage apps for iPhone, iPad & iPod
---
# Designvurderinger (alt for kort oppsummert) ;)
* Følg Apple guidelines - de kan nekte deg å legge den på app store
* Bærbare devicer - mange utfordringer
* Sitter på bussen
* Går til jobben og trykker
* Utnytte mulighetene - mer interessante apps
* Liten skjerm - store tomler.
* Ingen fysiske forskjeller på knapper og inputfelt, må se på skjermen for å bruke
* Forventninger - folk forventer at appen din fungerer perfekt, uansett hva
---
# Mockup verktøy og GUI stuff
* Litt tips for de som vil leke kreativ
---
# iOS - Layers
* Core OS
* snakke med devices gjennom blåtann feks.
* sikkerhet
* Bruker ikke dette med mindre du driver med ekstrem ytelsesoptimalisering
* Core Services
* Fundamentale tjenester
* iCloud-apiet
* Media
* OpenGL ES
* Quartz - 2D-tegning
* Core Animation - lage superfine animasjoner
* Core Touch
* Bibliotekene som er spesifikke for å lage iOS-apps
* Gestures
* UIKit - de fleste GUI-komponenter
*Dypere i lagene - mange likheter mellom Mac OS og iOS
---
.middle.center
# Verktøy
---
# Xcode
1. Åpne Xcode, vise eksiterende prosjekt og trykke 'create new project'
2. Gå raskt igjennom hvilke templates som finnes for iOS
3. Lage en Empty Application og vise stegene
4. Gå igjennom elementene i Xcode
* Venstre prosjekt navigatør
* Høyre fil inspektor for valgt fil eller element og hjelp meny
* Midten viser filene valgt til venstre, gå igjennom midten (summary)
5. Gå igjennom AppDelegate
7. Vise Window -> organizer og dokumentasjon
8. Vise play knapp og valg av scheme
6. Trykke play og gå videre til simulator
---
# iOS Simulator
1. Fortelle at det er en simulator og ikke emulator, dvs den kjører på mac'en sin hardware og vil ikke reflektere helt hvordan appen oppfører seg på device
2. Vise hardware menyen og hva man kan gjøre med den
---
# Interface Builder
1. Lage storyboard fil
2. Vise litt om interface builder og dra inn en label
3. Fjerne innhold til didFinishLaunchingWithOptions i appDelegate
4. Velge Main Storyboard i Summary
5. Starte appen igien
---
# Interface Builder - IBActions & IBOutlet
1. Hva hvis vi vil endre labelen med kode?
2. Legger til en viewController
3. Vi åpner storyboard, legger på custom class
4. Viser assistent editor og viser hvordan man drar inn for å lage IBOutlet
5. Lager en knapp og viser hvordan vi lager en IBAction
---
# Instruments
Forteller kjapt at Instruments kan brukes til å analysere appens performance og er en utrolig kraftig verktøy. Vi vil ikke gå inn på dette programmer i kurset
---
.middle.center
# En liten pause?
---
.middle.center
# Lets code!
---
# Hei på dere-appen
1 og 2:
.objective-c
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
NSLog(@"Hei på dere!");
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(110, 50, 200.0f, 20.0f)];
label.text = @"Hei på dere!";
[self.window addSubview:label];
return YES;
}
3. Lag ett storyboard og sett storyboard som default storyboard, dra inn en UILabel. ( husk å fjerne innnholdet i `didFinishLaunchingWithOptions` )
---
# Vis hva jeg skriver appen
1. Start ett nytt prosjekt, eller brukt det du allerede brukte i sist prosjekt
2. Lag en custom UIViewController klasse og en storyboard fil.
3. Sett denne storyboard filen som hoved storyboard
4. Sett UIViewController klassen du lagde som custom class i interface builder (identity inspector)
5. Dra inn GUI elementlene fra Object Library i interface builder
6. Knytt det sammen ved CTRL-hold på GUI elementet og dra det inn i custom viewcontrolleren din
7. I IBAction du lagde i custom klassen skriv koden for å ta ut det som står i UITextField og legg det på UILabel
---
# Den enkle browserappen
1. Lag customer view controller og en hoved storyboard, knytt disse opp med hverandre
2. Dra inn UIPickerView, UIWebView
3. Finn UIPickerViewDelegate og UIPickerViewDataSource, sett view controller til å vœre dette
4. Koble sammen dette i IB
5. Kjør app
---
.middle.center
# Del 2
---
.agenda
# Agenda
---
.middle.center
# Objective-C
---
# Arv
---
# Delegates
---
# Protocols
---
# Categories
---
.middle.center
# En liten pause?
---
# Selectors
* Måte å referere til en metode på.
* Kan brukes til å sende en referanse til en metode rundt i koden din
* var blabla = function() {}..
* Bruk
* Referere til en funksjon dynamisk, feks fra input fra brukeren
* Kan brukes for å kjøre en funksjon i en annen tråd (kommer tilbake til dette)
* Viser Objective-Cs mer dynamiske natur
---
# Exception Handling
* Exception handling er noe man sjeldent ser i Objective C-verden.
* Brukes ALDRI til kontroll-flyt
* Apple selv anbefaler å bruke NSError
---
# Blocks
* Kan sees på som en funksjon, men skrevet _inni_ en annen funksjon
* Det spesielle er at den kan referere til variabler på utsiden av blocken
---
# Threading
* Vanskelig
* Spesielt viktig på en mobil!
* på iOS kjører ting default på GUI-tråden
* lange operasjoner "henger"
* Ingen liker apps som "henger"
---
# Object Literals #1
---
# Object Literals #2
## NSNumber Literals
---
# Object Literals #3
## NSArray
* Legg merke til at NSArray og NSDictionary kun holder på objekter
---
.middle.center
# En liten pause?
---
.middle.center
#iOS - Standardkomponenter
---
#ViewController
Brukes til å orkistrere andrw views. Dette er den vi arvet fra sist gang for å sette opp vårt view, den brukes så og si aldri direkte.
Det er typisk i en view controller at man limer sammen objekter/klasser og grensesnitt, ett lite tips er å dra all logikk som ikke har med view ut i andre gjenbrukbare klasser.
En viewcontroller kan også inneholde andre view controllere.
Den står for resizing av views, tilpasse inneholde til viewene og lytter på events som fyres av fra disse viewene når brukeren trykker på dem.
Det er vanlig å ha flere view controllere i en app.
En view controller eies ofte enten av ett window (det som finnes i AppDelegate), eller en annen view controller.
---
#TableViewController og TableView
#pragma -
#pragma UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 2;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.textLabel.text = @"Morro";
return cell;
}
#pragma -
#pragma UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 200.0f;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"I felt a touch.;)");
}
---
#Navigation Controller
---
.middle.center
# Lets code!
---
.middle.center
# Del 3
---
.agenda
# Agenda
---
.middle.center
#iOS - Standardkomponenter
---
#Tab Bar Controller og tabbar
---
#CollectionViewController og CollectionView
---
.middle.center
#Debug time!
---
.middle.center
# Verktøy og testing, alternativer og forslag
---
# Testing
---
# IDE
---
# App salg
---
# Generelle Apps
---
.middle.center
# Forslag til bøker og ressurser
---
## Bøker
## Linker
---
.middle.center
# En liten pause?
---
.middle.center
# Lets code!
---
.middle.center
# Takk for oss
</textarea>
<div id="slideshow"></div>
</body>
</html>