|
Vorwort |
22 |
|
|
1 Über iOS |
26 |
|
|
1.1 Was ist iOS? |
26 |
|
|
1.1.1 iOS und OS X |
27 |
|
|
1.1.2 Besonderheiten der iOS-Plattform |
27 |
|
|
1.2 iOS für Entwickler |
28 |
|
|
1.2.1 Hardware für Entwickler |
29 |
|
|
1.2.2 Software für Entwickler |
30 |
|
|
1.2.3 Das Apple Developer Program |
31 |
|
|
1.3 Der Aufbau von iOS |
33 |
|
|
1.3.1 Die vier Schichten von iOS |
33 |
|
|
1.4 Die perfekte iOS-App |
35 |
|
|
1.4.1 Apple Human Interface Guidelines |
36 |
|
|
2 Die Programmiersprache – Objective-C |
38 |
|
|
2.1 Über Objective-C und objektorientierte Programmierung |
38 |
|
|
2.2 Grundlagen der Programmierung |
39 |
|
|
2.2.1 Objekte |
39 |
|
|
2.2.2 Primitive Datentypen |
40 |
|
|
2.2.3 Variablen |
41 |
|
|
2.2.4 Operatoren |
42 |
|
|
2.2.5 Abfragen und Schleifen |
43 |
|
|
2.2.6 Kommentare |
47 |
|
|
2.3 Aufbau einer Klasse |
48 |
|
|
2.3.1 Die Header-Datei |
48 |
|
|
2.3.2 Die Implementation-Datei |
50 |
|
|
2.3.3 Los geht’s: Unsere erste Klasse! |
51 |
|
|
2.4 Methoden |
55 |
|
|
2.4.1 Aufbau von Methoden |
55 |
|
|
2.4.2 Methoden in Header- und Implementation-Dateien einer Klasse |
57 |
|
|
2.4.3 Implementierung von Methoden |
58 |
|
|
2.4.4 Methoden aufrufen |
61 |
|
|
2.4.5 Klassen- und Instanzmethoden |
62 |
|
|
2.5 Instanzvariablen |
63 |
|
|
2.6 Properties |
64 |
|
|
2.6.1 Aufbau einer Property |
65 |
|
|
2.6.2 Die Punktnotation |
67 |
|
|
2.6.3 Optionen |
68 |
|
|
2.6.4 Direktzugriff auf Properties |
69 |
|
|
2.6.5 Setter und Getter überschreiben |
71 |
|
|
2.7 Konstanten |
74 |
|
|
2.7.1 Deklaration von Konstanten |
74 |
|
|
2.8 Namenskonventionen |
75 |
|
|
2.8.1 Klassen |
75 |
|
|
2.8.2 Methoden |
76 |
|
|
2.8.3 Properties |
76 |
|
|
2.9 Strukturen |
76 |
|
|
2.9.1 enum |
77 |
|
|
2.9.2 typedef |
77 |
|
|
2.10 Initialisierung von Objekten |
78 |
|
|
2.10.1 alloc und init |
79 |
|
|
2.10.2 Zeiger |
81 |
|
|
2.11 init im Detail |
82 |
|
|
2.11.1 Erstellen mehrerer init-Methoden |
84 |
|
|
2.11.2 Designated Initializer |
85 |
|
|
2.12 Vererbung |
87 |
|
|
2.12.1 Methoden der Superklasse überschreiben |
89 |
|
|
2.13 Kategorien |
91 |
|
|
2.13.1 Aufbau von Kategorien |
91 |
|
|
2.13.2 Kategorien in Xcode erstellen |
92 |
|
|
2.14 Erweiterungen |
94 |
|
|
2.14.1 Aufbau von Erweiterungen |
94 |
|
|
2.14.2 Erweiterungen innerhalb der Implementation-Datei |
95 |
|
|
2.14.3 Erweiterungen in Xcode erstellen |
96 |
|
|
2.15 Protokolle |
97 |
|
|
2.15.1 Aufbau von Protokollen |
98 |
|
|
2.15.2 Zuweisen eines Protokolls zu einer Klasse |
99 |
|
|
2.15.3 Vererbung in Protokollen |
99 |
|
|
2.15.4 Protokolle in Xcode erstellen |
100 |
|
|
2.16 #import und @class |
101 |
|
|
2.16.1 #import |
101 |
|
|
2.16.2 @class |
102 |
|
|
2.17 Blöcke |
104 |
|
|
2.17.1 Ja zu Blöcken! |
104 |
|
|
2.17.2 Was sind Blöcke? |
104 |
|
|
2.17.3 Aufbau eines Blocks |
105 |
|
|
2.17.4 Blockvariablen |
109 |
|
|
2.17.5 Globale Blöcke |
109 |
|
|
2.18 Singletons |
110 |
|
|
3 Der Neue im Club – Swift |
114 |
|
|
3.1 Programmierst du noch oder swifst du schon? |
114 |
|
|
3.1.1 Über Swift |
114 |
|
|
3.1.2 Voraussetzungen zur Nutzung von Swift |
114 |
|
|
3.1.3 Swift und Objective-C |
115 |
|
|
3.1.4 Playgrounds |
115 |
|
|
3.2 Grundlagen der Programmierung |
117 |
|
|
3.2.1 Fundamental Types |
117 |
|
|
3.2.2 Variablen und Konstanten |
118 |
|
|
3.2.3 Operatoren |
120 |
|
|
3.2.4 Abfragen und Schleifen |
121 |
|
|
3.2.5 Kommentare |
127 |
|
|
3.2.6 print |
128 |
|
|
3.3 Fundamental Types im Detail |
130 |
|
|
3.3.1 Strings |
130 |
|
|
3.3.2 Arrays |
133 |
|
|
3.3.3 Dictionaries |
139 |
|
|
3.3.4 Any und AnyObject |
142 |
|
|
3.4 Aufbau einer Klasse |
142 |
|
|
3.4.1 Erstellen einer Instanz einer Klasse |
145 |
|
|
3.4.2 Zugriff auf Eigenschaften einer Klasse |
145 |
|
|
3.5 Methoden |
146 |
|
|
3.5.1 Methodenmit Rückgabewert |
147 |
|
|
3.5.2 Methoden mit Parametern |
148 |
|
|
3.5.3 Local und External Parameter Names |
151 |
|
|
3.5.4 Aufruf von Methoden einer Klasse |
153 |
|
|
3.5.5 Zugriff auf andere Eigenschaften und Methoden einer Klasse |
154 |
|
|
3.5.6 Klassen- und Instanzmethoden |
155 |
|
|
3.6 Properties |
157 |
|
|
3.6.1 Computed Properties |
157 |
|
|
3.6.2 Property Observers |
160 |
|
|
3.6.3 Type Properties |
161 |
|
|
3.7 Vererbung |
162 |
|
|
3.7.1 Überschreiben von Eigenschaften und Methoden der Superklasse |
164 |
|
|
3.7.2 Zugriff auf Eigenschaften und Methoden der Superklasse |
165 |
|
|
3.8 Optionals |
166 |
|
|
3.8.1 Deklaration von Optionals |
166 |
|
|
3.8.2 Zugriff auf Optionals |
167 |
|
|
3.9 Initialisierung |
170 |
|
|
3.9.1 Schreiben von Initializern |
171 |
|
|
3.9.2 Designated und Convenience Initializer |
175 |
|
|
3.9.3 Initializer und Vererbung |
176 |
|
|
3.9.4 Deinitialisierung |
178 |
|
|
3.10 Type Casting |
179 |
|
|
3.10.1 Typ prüfen |
179 |
|
|
3.10.2 Downcasting |
181 |
|
|
3.11 Enumerations |
183 |
|
|
3.11.1 Zusätzliche Werte in Member einer Enumeration speichern |
184 |
|
|
3.12 Structures |
186 |
|
|
3.13 Error Handling Model |
187 |
|
|
3.14 Extensions |
189 |
|
|
3.15 Protocols |
190 |
|
|
3.15.1 Protocol Type |
191 |
|
|
3.16 Access Control |
193 |
|
|
4 Programmierung für iOS |
196 |
|
|
4.1 Grundlagen |
196 |
|
|
4.2 Foundation Framework |
196 |
|
|
4.2.1 Die wichtigsten Klassen aus dem Foundation Framework und ihre Funktionen |
197 |
|
|
4.3 UIKit Framework |
201 |
|
|
4.4 Speicherverwaltung mit ARC |
202 |
|
|
4.5 Besonderheiten von Objective-C |
205 |
|
|
4.5.1 Kurzschreibweisen zum Erstellen von Objekten |
206 |
|
|
4.5.2 Vergleichen der Werte von verschiedenen Objekten |
208 |
|
|
4.5.3 Schlüsselwörter zum Zusammenspiel mit Optionals |
209 |
|
|
4.6 Besonderheiten von Swift |
210 |
|
|
4.6.1 Zusammenspiel zwischen Fundamental Types und Foundation-Framework-Klassen |
210 |
|
|
4.6.2 Playgrounds im Detail |
211 |
|
|
4.7 Objective-C und Swift vereint |
215 |
|
|
4.7.1 Objective-C-Code in Swift verwenden |
215 |
|
|
4.7.2 Swift-Code in Objective-C verwenden |
216 |
|
|
4.8 NSError |
217 |
|
|
4.8.1 Eigene Methode mit NSError-Parameter erstellen |
218 |
|
|
4.9 Doxygen-Dokumentation |
219 |
|
|
4.9.1 Besonderheiten bei Methoden |
221 |
|
|
4.9.2 Doxygen-Dokumentation in Xcode |
222 |
|
|
4.10 Nebenläufigkeit mit Grand Central Dispatch |
223 |
|
|
4.10.1 Parallel laufenden Code erstellen |
224 |
|
|
4.11 Grundlegende Struktur einer App |
226 |
|
|
4.11.1 main.m |
226 |
|
|
4.11.2 Info.plist |
226 |
|
|
4.11.3 App Delegate |
227 |
|
|
4.12 Lebenszyklus einer iOS-App |
228 |
|
|
4.12.1 Start einer App |
228 |
|
|
4.12.2 Lebenszyklus einer App |
229 |
|
|
4.12.3 Die Methoden des App Delegate |
230 |
|
|
4.12.4 Start der App |
231 |
|
|
4.13 Tipps für die tägliche Arbeit |
233 |
|
|
4.13.1 Die netten Kleinigkeiten .?.?. |
233 |
|
|
4.13.2 Fast Enumeration in Objective-C |
234 |
|
|
4.13.3 Type Casting in Objective-C |
234 |
|
|
4.13.4 Xcode-Beispielprojekte |
235 |
|
|
5 Die Entwicklungsumgebung – Xcode |
236 |
|
|
5.1 Willkommen bei Xcode! |
236 |
|
|
5.1.1 Was ist Xcode? |
237 |
|
|
5.1.2 Interface Builder und Xcode – endlich vereint! |
237 |
|
|
5.2 Arbeiten mit Xcode |
238 |
|
|
5.2.1 Dateien und Formate eines Xcode-Projekts |
238 |
|
|
5.2.2 Umgang mit Dateien und Ordnern in Xcode |
243 |
|
|
5.3 Der Aufbau von Xcode |
246 |
|
|
5.3.1 Die Toolbar |
246 |
|
|
5.3.2 Die Navigation Area |
248 |
|
|
5.3.3 Die Editor Area |
252 |
|
|
5.3.4 Die Utilities Area |
254 |
|
|
5.3.5 Die Debug Area |
255 |
|
|
5.4 Einstellungen in Xcode |
256 |
|
|
5.4.1 Anpassen von Xcode |
256 |
|
|
5.4.2 General |
256 |
|
|
5.4.3 Accounts |
257 |
|
|
5.4.4 Behaviors |
258 |
|
|
5.4.5 Navigation |
258 |
|
|
5.4.6 Fonts & Colors |
259 |
|
|
5.4.7 Text Editing |
260 |
|
|
5.4.8 Key Bindings |
260 |
|
|
5.4.9 Source Control |
261 |
|
|
5.4.10 Downloads |
262 |
|
|
5.4.11 Locations |
262 |
|
|
5.5 Projekteinstellungen |
263 |
|
|
5.5.1 Grundlagen |
263 |
|
|
3.5.2 Einstellungen am Projekt |
265 |
|
|
5.5.2 Einstellungen am Target |
268 |
|
|
5.5.3 Einstellungen am Scheme |
274 |
|
|
5.6 Grafiken und Asset-Bundles |
277 |
|
|
5.7 Lokalisierung mit Localizable.strings |
279 |
|
|
5.7.1 Grundlagen |
279 |
|
|
5.7.2 NSLocalizedString |
279 |
|
|
5.7.3 Erstellen der Localizable.strings-Datei |
280 |
|
|
5.7.4 Localized String mit Parameter |
282 |
|
|
5.7.5 Alle Localized Strings automatisch auslesen |
283 |
|
|
5.8 Der iOS-Simulator |
284 |
|
|
5.8.1 Grundlagen |
284 |
|
|
5.8.2 Funktionen und Möglichkeiten des Simulators |
284 |
|
|
5.8.3 Performance und Einschränkungen des Simulators |
288 |
|
|
5.9 Dokumentation |
288 |
|
|
5.9.1 Nichts geht über die Dokumentation! |
288 |
|
|
5.9.2 Das Documentation-Window |
290 |
|
|
5.9.3 Direktes Aufrufen der Dokumentation aus Xcode heraus |
293 |
|
|
5.10 Devices |
294 |
|
|
5.11 Organizer |
296 |
|
|
5.12 Projects |
299 |
|
|
5.13 Debugging in Xcode |
300 |
|
|
5.13.1 Grundlagen – über das Debugging |
300 |
|
|
5.13.2 Die Debug Area |
300 |
|
|
5.13.3 Die Arbeit mit dem Debugger – NSLog und Breakpoints |
302 |
|
|
5.13.4 Debug Navigator |
310 |
|
|
5.14 Refactoring |
311 |
|
|
5.14.1 Grundlagen |
311 |
|
|
5.14.2 Refactoring-Funktionen in Xcode |
312 |
|
|
5.15 Instruments |
314 |
|
|
5.15.1 Über Instruments |
314 |
|
|
5.15.2 Nächste Schritte |
317 |
|
|
5.16 Tipps für die tägliche Arbeit |
318 |
|
|
5.16.1 Man lernt immer was dazu! |
318 |
|
|
5.16.2 Code Snippets |
318 |
|
|
5.16.3 Open Quickly |
319 |
|
|
5.16.4 Caller einer Methode feststellen |
320 |
|
|
5.16.5 Speicherorte für Ordner und Dateien ändern |
321 |
|
|
5.16.6 Shortcuts für die Navigation Area |
321 |
|
|
5.16.7 Run Without Building |
322 |
|
|
5.16.8 Clean Build |
322 |
|
|
6 MVC – Model-View-Controller |
324 |
|
|
6.1 MVC?.?.?. was? |
324 |
|
|
6.2 MVC in der Praxis |
326 |
|
|
6.3 Kommunikation zwischen Model und Controller |
326 |
|
|
6.3.1 Key-Value-Observing |
327 |
|
|
6.3.2 Notifications |
333 |
|
|
6.4 Kommunikation zwischen View und Controller |
335 |
|
|
6.4.1 Target-Action |
335 |
|
|
6.4.2 Delegates |
337 |
|
|
7 Die Vielfalt der (View-)Controller |
340 |
|
|
7.1 Alles beginnt mit einem View- Controller .?.?. |
340 |
|
|
7.2 UIViewController – die Mutter aller View-Controller |
342 |
|
|
7.2.1 Wichtige Methoden von UIViewController |
343 |
|
|
7.2.2 UIView – fester Bestandteil eines jeden UIViewControllers |
347 |
|
|
7.3 View-Controller-Hierarchien |
348 |
|
|
7.4 View-Controller erstellen mit dem Interface Builder |
350 |
|
|
7.4.1 View-Controller mit Nib-File |
351 |
|
|
7.5 Storyboards |
382 |
|
|
7.5.1 Über Storyboards |
382 |
|
|
7.5.2 Das Storyboard-Projekt |
383 |
|
|
7.5.3 Die Klasse UIStoryboard |
392 |
|
|
7.5.4 Segues |
394 |
|
|
7.5.5 Zugriff über den App Delegate |
397 |
|
|
7.5.6 Quo vadis – Storyboard oder Nib-File? |
398 |
|
|
7.6 Auto Layout |
399 |
|
|
7.6.1 Setzen und Konfigurieren von Constraints |
400 |
|
|
7.6.2 Constraints bearbeiten und weiter anpassen |
401 |
|
|
7.6.3 „Optimale“ Constraints automatisch setzen lassen |
403 |
|
|
7.7 UIViewController und seine Subklassen |
404 |
|
|
7.7.1 UINavigationController |
404 |
|
|
7.7.2 UITabBarController |
410 |
|
|
7.7.3 UITableViewController |
414 |
|
|
7.7.4 UICollectionViewController |
421 |
|
|
7.7.5 UISplitViewController |
423 |
|
|
8 Views erstellen und gestalten |
426 |
|
|
8.1 Über Views in iOS |
426 |
|
|
8.2 UIView – die Mutter aller Views |
426 |
|
|
8.3 Arbeiten mit UIView |
427 |
|
|
8.3.1 Programmatisches Erstellen einer UIView |
427 |
|
|
8.3.2 View-Hierarchien |
429 |
|
|
8.3.3 Weiterführendes zu UIView |
433 |
|
|
8.4 Views erstellen mit dem Interface Builder |
434 |
|
|
8.4.1 Grundlagen |
434 |
|
|
8.4.2 View-Klasse mit Nib-File erstellen |
435 |
|
|
8.4.3 Beliebiges Nib-File laden und verwenden |
439 |
|
|
8.4.4 Nib-File nachträglich erstellen |
440 |
|
|
8.4.5 Unterschiedliche Nib-Files für iPhone und iPad erstellen |
442 |
|
|
8.5 Die wichtigsten Views und ihre Funktionen |
444 |
|
|
8.5.1 Grundlagen |
444 |
|
|
8.5.2 UILabel |
444 |
|
|
8.5.3 UIButton |
444 |
|
|
8.5.4 UISwitch |
445 |
|
|
8.5.5 UISegmentedControl |
445 |
|
|
8.5.6 UITextField |
445 |
|
|
8.5.7 UIImageView |
446 |
|
|
8.5.8 UIAlertView |
446 |
|
|
8.5.9 UIActionSheet |
448 |
|
|
8.5.10 UIPickerView |
448 |
|
|
8.5.11 UIDatePicker |
449 |
|
|
8.5.12 UIWebView |
449 |
|
|
8.5.13 UIMapView |
450 |
|
|
8.5.14 UIScrollView |
450 |
|
|
8.5.15 UITextView |
451 |
|
|
8.5.16 UITableView |
452 |
|
|
8.5.17 UICollectionView |
452 |
|
|
8.5.18 Wichtig und unerlässlich: die Dokumentation! |
452 |
|
|
8.5.19 Views und der Interface Builder |
453 |
|
|
8.6 Die Grundlage gut gestalteter Views |
453 |
|
|
9 Das Model und die Datenhaltung |
456 |
|
|
9.1 Die Logik Ihrer App |
456 |
|
|
9.2 Benutzereinstellungen sichern und nutzen |
457 |
|
|
9.2.2 Über NSUserDefaults |
457 |
|
|
9.2.3 Standardeinstellungen festlegen |
459 |
|
|
9.2.4 NSUserDefaults zurücksetzen |
460 |
|
|
9.3 Zugriff auf das Dateisystem |
460 |
|
|
9.3.1 Das Dateisystem von iOS |
460 |
|
|
9.3.2 NSFileManager |
461 |
|
|
9.3.3 File-Sharing-Funktion nutzen |
468 |
|
|
9.4 Core Data |
469 |
|
|
9.4.1 Datenbankverwaltung mit Core Data |
469 |
|
|
9.4.2 Wie funktioniert Core Data? |
470 |
|
|
9.4.3 Die Klassen und Bestandteile von Core Data |
471 |
|
|
9.4.4 Aufbau eines Standard-Core Data Stacks |
472 |
|
|
9.4.5 Der Core Data-Editor |
475 |
|
|
9.4.6 Erstellen eines neuen Managed-Objects |
483 |
|
|
9.4.7 Löschen eines Managed-Objects |
484 |
|
|
9.4.8 Laden von Managed-Objects |
484 |
|
|
9.4.9 Was kommt als Nächstes? |
485 |
|
|
10 Local und Push Notifications |
486 |
|
|
10.1 Was sind Notifications? |
486 |
|
|
10.2 Registrieren von Notification Types |
488 |
|
|
10.3 Registrieren von Notification Categories und Actions |
490 |
|
|
10.3.1 Erstellen einer Action |
491 |
|
|
10.3.2 Erstellen einer Kategorie |
492 |
|
|
10.3.3 Reagieren auf eine Action |
494 |
|
|
10.4 Local Notifications |
496 |
|
|
10.4.1 Festlegen des Ausführungstermins |
497 |
|
|
10.4.2 Konfiguration des Alerts |
498 |
|
|
10.4.3 Konfiguration des Sounds |
500 |
|
|
10.4.4 Konfiguration des Badge Values |
501 |
|
|
10.4.5 Speichern zusätzlicher Informationen in einer Local Notification |
501 |
|
|
10.4.6 Registrieren von Local Notifications im System |
502 |
|
|
10.4.7 Abbrechen bereits registrierter Local Notifications |
503 |
|
|
10.4.8 Reagieren auf Feuern und Auswahl einer Local Notification |
503 |
|
|
10.5 Push Notifications |
504 |
|
|
10.5.1 Versand von Push Notifications |
505 |
|
|
10.5.2 Erstellen einer Push Notification |
509 |
|
|
10.5.3 Qualitiy of Service |
511 |
|
|
11 Extensions |
512 |
|
|
11.1 Verfügbare Typen von Extensions |
512 |
|
|
11.2 Erstellen von Extensions in Xcode |
514 |
|
|
11.3 Aufbau einer Extension |
517 |
|
|
11.4 Funktionsweise einer Extension |
517 |
|
|
11.5 Wichtige Klassen und Objekte |
518 |
|
|
11.6 Unterstützte Dateitypen für Share- und Action-Extensions festlegen |
519 |
|
|
11.7 Today |
521 |
|
|
11.7.1 Today-Extension testen |
523 |
|
|
11.8 Share |
524 |
|
|
11.9 Action |
525 |
|
|
11.9.1 Action mit User Interface |
525 |
|
|
11.9.2 Action ohne User Interface |
526 |
|
|
11.10 Photo Editing |
527 |
|
|
11.10.1 Festlegen der unterstützten Typen zur Bearbeitung |
531 |
|
|
11.11 Document Provider |
532 |
|
|
11.11.1 Document Provider-Extension |
533 |
|
|
11.11.2 File Provider-Extension |
536 |
|
|
11.11.3 Document Provider aufrufen |
538 |
|
|
11.12 Custom Keyboard |
540 |
|
|
11.12.1 Erstellen eines Custom Keyboards |
540 |
|
|
11.12.2 Arbeit mit der Klasse UIInputViewController |
540 |
|
|
11.12.3 Bearbeiten und Setzen von Text |
542 |
|
|
11.12.4 Mehrsprachige Keyboards |
543 |
|
|
11.13 Content Blocker |
544 |
|
|
11.13.1 Konfiguration eines Content Blockers |
545 |
|
|
11.13.2 Aktualisieren eines Content Blockers |
548 |
|
|
11.13.3 Die Klasse ActionRequestHandler |
548 |
|
|
11.14 Shared Links |
549 |
|
|
11.14.1 Erstellen eines NSExtensionItem |
551 |
|
|
11.14.2 NSExtensionItem als Shared Link bereitstellen |
552 |
|
|
11.15 Watch App |
553 |
|
|
11.16 App Groups |
553 |
|
|
11.16.1 Registrieren einer App Group im Apple Developer Portal |
553 |
|
|
11.16.2 Registrieren einer App Group innerhalb einer App |
555 |
|
|
11.16.3 Zugriff auf eine App Group |
555 |
|
|
12 App-Entwicklung für die Apple Watch |
558 |
|
|
12.1 Apples neues großes Ding: Die Apple Watch |
558 |
|
|
12.2 Möglichkeiten, Einschränkungen, Unterschiede |
559 |
|
|
12.3 Das WatchKit SDK |
561 |
|
|
12.3.1 WKInterfaceController |
561 |
|
|
12.3.2 WKInterfaceObject |
562 |
|
|
12.3.3 WKExtensionDelegate |
563 |
|
|
12.3.4 Weitere Klassen |
563 |
|
|
12.4 Aufbau und Funktionsweise von Apple Watch-Apps |
563 |
|
|
12.4.1 iPhone-App |
564 |
|
|
12.4.2 WatchKit Extension |
564 |
|
|
12.4.3 WatchKit App |
564 |
|
|
12.4.4 Verbindung von WatchKit Extension und WatchKit App |
565 |
|
|
12.4.5 Notification Scene und Glance Scene |
565 |
|
|
12.4.6 Complications |
566 |
|
|
12.5 Erstellen einer WatchKit App mitsamt WatchKit Extension |
566 |
|
|
12.5.1 Dateien der WatchKit Extension |
569 |
|
|
12.5.2 Dateien der WatchKit App |
569 |
|
|
12.5.3 Ausführen und Testen der Apple Watch-App |
570 |
|
|
12.6 Lebenszyklus einer WatchKit App |
571 |
|
|
12.7 Der WKInterfaceController im Detail |
573 |
|
|
12.7.1 Initialisierung |
573 |
|
|
12.7.2 Activation Events |
574 |
|
|
12.7.3 Setzen des Titels |
575 |
|
|
12.7.4 Ein- und Ausblenden von Interface-Controllern |
575 |
|
|
12.7.5 Umsetzen eines Navigation Stacks |
577 |
|
|
12.7.6 Reaktion auf Storyboard-Events |
578 |
|
|
12.7.7 Weitere Attribute |
579 |
|
|
12.7.8 Weitere Funktionen von WKInterfaceController |
580 |
|
|
12.8 Arbeiten mit dem Interface-Storyboard einer WatchKit App |
580 |
|
|
12.8.1 Erstellen und Konfigurieren eines WKInterfaceController |
581 |
|
|
12.8.2 Hinzufügen und Konfigurieren von Interface-Elementen |
582 |
|
|
12.8.3 Positionierung und Anordnung von Interface-Elementen |
583 |
|
|
12.8.4 Ändern der Größe von Interface-Elementen |
584 |
|
|
12.8.5 Unterschiedliche Konfigurationen für verschiedene Apple Watch-Größen |
586 |
|
|
12.8.6 Gruppierung von Interface-Elementen mittels WKInterfaceGroup |
588 |
|
|
12.8.7 Verbindung von Storyboard und Code |
589 |
|
|
12.8.8 Zusammenfassen mehrerer Interface-Controller zu einem page-based Interface |
592 |
|
|
12.8.9 Erstellen und Konfigurieren von Segues |
592 |
|
|
12.9 Erstellen von Tabellen |
595 |
|
|
12.9.1 Hinzufügen einer Tabelle im Storyboard |
595 |
|
|
12.9.2 Konfiguration einer Zelle |
596 |
|
|
12.9.3 Konfiguration einer Tabelle |
600 |
|
|
12.9.4 Verwenden verschiedener Zellen in einer Tabelle |
602 |
|
|
12.9.5 Zellen hinzufügen und entfernen |
604 |
|
|
12.9.6 Direkt zu Zelle scrollen |
606 |
|
|
12.9.7 Aktuelle Anzahl an Zellen auslesen |
606 |
|
|
12.9.8 Auf Auswahl einer Zelle reagieren |
606 |
|
|
12.9.9 Segues von Zellen einer Tabelle über das Storyboard konfigurieren |
607 |
|
|
12.10 Erstellen von Menüs |
609 |
|
|
12.10.1 Erstellen eines Menüs im Storyboard |
610 |
|
|
12.10.2 Erstellen eines Menüs im Code |
613 |
|
|
12.10.3 Fazit: Menüerstellung im Storyboard oder Code? |
616 |
|
|
12.10.4 Mischen von Menüpunkten aus Storyboard und Code |
616 |
|
|
12.11 Eingabe von Text |
616 |
|
|
12.12 Glance Scene |
618 |
|
|
12.12.1 Erstellen einer Glance Scene |
620 |
|
|
12.12.2 Lebenszyklus einer Glance Scene |
621 |
|
|
12.12.3 Angepasster App-Start mittels Glance Scene |
621 |
|
|
12.12.4 Testen einer Glance Scene |
623 |
|
|
12.13 Notification Scene |
624 |
|
|
12.13.1 Short-Look und Long-Look Interface |
624 |
|
|
12.13.2 Long-Look Interface im Detail |
625 |
|
|
12.13.3 Erstellen eigener Notification Scenes |
626 |
|
|
12.13.4 Reaktion auf Action-Buttons |
634 |
|
|
12.13.5 Testen einer Notification Scene |
636 |
|
|
12.14 Complications |
636 |
|
|
12.14.1 Was sind Complications? |
637 |
|
|
12.14.2 Das ClockKit Framework |
637 |
|
|
12.14.3 Aufbau und Bestandteile von Complications |
637 |
|
|
12.14.4 Vorbereiten des eigenen Projekts |
641 |
|
|
12.14.5 Entwicklung einer Complication |
642 |
|
|
12.14.6 Bereitstellen der Complication mittels CLKComplicationDataSource |
646 |
|
|
12.15 Kommunikation und Datenaustausch zwischen iOS und watchOS |
650 |
|
|
12.15.1 WatchConnectivity |
651 |
|
|
12.16 Was sonst noch zu sagen und zu beachten ist |
656 |
|
|
13 Unit-Tests |
658 |
|
|
13.1 Unit-Tests in der iOS-Entwicklung |
658 |
|
|
13.1.1 Grundlagen |
658 |
|
|
13.1.2 Aufbau und Funktionsweise von Tests |
662 |
|
|
13.1.3 Aufbau einer Test-Case-Klasse |
664 |
|
|
13.1.4 Neue Test-Case-Klasse erstellen |
665 |
|
|
13.1.5 Ausführen von Tests |
666 |
|
|
13.1.6 Was sollte ich eigentlich testen? |
667 |
|
|
13.2 Performance-Tests |
668 |
|
|
13.3 UI-Testing |
670 |
|
|
13.3.1 Klassen für UI-Testing |
671 |
|
|
13.3.2 Aufbau von UI-Testing-Klassen |
673 |
|
|
13.3.3 Erstellen von UI-Tests |
674 |
|
|
13.3.4 Einsatz von UI-Tests |
674 |
|
|
13.4 Test-Driven Development |
675 |
|
|
14 Versionierung mit Git |
676 |
|
|
14.1 Über Versionskontrolle |
676 |
|
|
14.2 Basisfunktionen und -begriffe von Git |
676 |
|
|
14.2.1 Begriffe |
676 |
|
|
14.2.2 Funktionen |
677 |
|
|
14.3 Source Control in Xcode |
678 |
|
|
14.4 Version Editor und Source Control |
682 |
|
|
15 Veröffentlichung im App Store |
686 |
|
|
15.1 Zertifikate, Provisioning Profiles und Ihre App |
686 |
|
|
15.1.1 Certificates, Identifiers & Profiles |
688 |
|
|
15.1.2 Erstellen von .?.?. |
690 |
|
|
15.2 Testen auf dem eigenen Endgerät |
703 |
|
|
15.2.1 Setzen des Teams |
703 |
|
|
15.2.2 Auswahl Ihres iOS-Geräts |
704 |
|
|
15.3 iTunes Connect und Veröffentlichung im App Store |
706 |
|
|
15.3.1 Vorbereiten der App in iTunes Connect |
707 |
|
|
15.3.2 Upload der App in den App Store |
710 |
|
|
15.3.3 Wie geht es weiter? |
712 |
|
|
Index |
714 |
|