|
Vorwort |
25 |
|
|
TEIL I Swift |
27 |
|
|
1 Hello World! |
29 |
|
|
1.1 »Hello World« im Playground |
30 |
|
|
Voraussetzungen |
30 |
|
|
Apple Developer Program |
30 |
|
|
Den Playground starten |
30 |
|
|
Hello World! |
31 |
|
|
Grafische Darstellung von Daten |
32 |
|
|
Darstellung von Objekten |
33 |
|
|
Kommentare |
35 |
|
|
Playgrounds mit mehreren Dateien |
36 |
|
|
1.2 »Hello World« als Terminal-App |
37 |
|
|
Xcode kennenlernen |
37 |
|
|
Wo ist die App? |
40 |
|
|
Mehr als nur »Hello World!« |
41 |
|
|
Den Swift-Interpreter und -Compiler direkt aufrufen |
42 |
|
|
1.3 Swift-Crashkurs |
45 |
|
|
Elementare Syntaxregeln |
45 |
|
|
Kommentare |
46 |
|
|
Markdown-Kommentare |
46 |
|
|
Variablen und Konstanten |
47 |
|
|
Zahlen und Zeichenketten |
47 |
|
|
Datentypen und Optionals |
48 |
|
|
Tupel, Arrays und Dictionaries |
50 |
|
|
Schleifen |
51 |
|
|
Verzweigungen |
52 |
|
|
Funktionen |
52 |
|
|
Closures |
54 |
|
|
Klassen und Datenstrukturen |
54 |
|
|
Fehlerabsicherung |
55 |
|
|
1.4 Xcode-Crashkurs |
56 |
|
|
Navigator |
57 |
|
|
Editor |
58 |
|
|
Assistenzeditor |
59 |
|
|
Maus- bzw. Trackpad-Kürzel |
60 |
|
|
Tastenkürzel und Editoreinstellungen |
60 |
|
|
Werkzeugleiste (Inspector und Library Pane) |
61 |
|
|
Code-Snippets |
61 |
|
|
Speichern |
63 |
|
|
Versionsverwaltung (Git) |
63 |
|
|
Vorhandenen Code für eine neue Swift-Version anpassen |
66 |
|
|
2 Operatoren |
69 |
|
|
2.1 Zuweisungs- und Rechenoperatoren |
69 |
|
|
Einfache Zuweisung |
69 |
|
|
Wert- versus Referenztypen |
70 |
|
|
Elementare Rechenoperatoren |
71 |
|
|
Zeichenketten aneinanderfügen |
72 |
|
|
Inkrement und Dekrement |
73 |
|
|
Rechnen mit Bits |
73 |
|
|
Kombinierte Rechen- und Zuweisungsoperationen |
74 |
|
|
2.2 Vergleichsoperatoren und logische Operatoren |
74 |
|
|
Vergleichsoperatoren |
74 |
|
|
== versus === |
75 |
|
|
Vergleiche mit ~= |
76 |
|
|
Datentyp-Vergleich (»is«) |
77 |
|
|
Casting-Operator (»as«) |
77 |
|
|
Logische Operatoren |
78 |
|
|
2.3 Range-Operatoren |
78 |
|
|
Interval-Operatoren |
79 |
|
|
2.4 Operatoren für Fortgeschrittene |
80 |
|
|
Ternärer Operator |
80 |
|
|
Unwrapping- und Nil-Coalescing-Operator |
81 |
|
|
Optional Chaining |
82 |
|
|
Operator-Präferenz |
82 |
|
|
2.5 Operator Overloading |
83 |
|
|
Vergleichsoperator für Zeichenketten |
84 |
|
|
3 Variablenverwaltung und Datentypen |
85 |
|
|
3.1 Variablen und Konstanten |
85 |
|
|
Deklaration von Variablen |
85 |
|
|
Regeln für Variablennamen |
86 |
|
|
Konstanten |
87 |
|
|
Eigenschaften |
88 |
|
|
Enumerationen (Enums) |
89 |
|
|
3.2 Zahlen und boolesche Werte |
91 |
|
|
Ganze Zahlen |
91 |
|
|
Fließkommazahlen |
92 |
|
|
Typumwandlungen |
93 |
|
|
Zufallszahlen |
93 |
|
|
Double-Zufallszahlen |
94 |
|
|
Boolesche Werte |
94 |
|
|
3.3 Zeichenketten |
94 |
|
|
String-Eigenschaften |
95 |
|
|
Syntax |
96 |
|
|
Funktionen und Methoden zur Bearbeitung von Zeichenketten |
98 |
|
|
Länge von Zeichenketten ermitteln |
98 |
|
|
Vergleichen und sortieren |
99 |
|
|
Suchen und ersetzen |
100 |
|
|
Reguläre Ausdrücke |
102 |
|
|
Bestandteile von Zeichenketten |
104 |
|
|
split und joinWithSeparator |
105 |
|
|
Zeichenketten manipulieren |
106 |
|
|
Palindrom-Test |
107 |
|
|
Teilzeichenketten extrahieren |
108 |
|
|
Teilzeichenketten komfortabler auslesen |
109 |
|
|
Zahlen formatieren |
111 |
|
|
Zahlen mit dem NSNumberFormatter formatieren |
112 |
|
|
Zeichenketten in Zahlen umwandeln (parsen) |
113 |
|
|
Zahlen mit dem NSNumberFormatter parsen |
114 |
|
|
3.4 Datum und Uhrzeit |
115 |
|
|
3.5 Optionals |
117 |
|
|
Optionals deklarieren |
118 |
|
|
Optionals auslesen |
118 |
|
|
nil-Test und if-let |
119 |
|
|
Optional Chaining |
120 |
|
|
Nil Coalescing |
121 |
|
|
3.6 Interna der Variablenverwaltung |
122 |
|
|
Wert- versus Referenztypen |
122 |
|
|
Datentypen |
123 |
|
|
Syntaktischer Zucker |
124 |
|
|
Typen-Aliase |
125 |
|
|
Datentyp ermitteln und ändern (Casting) |
125 |
|
|
Reflection |
126 |
|
|
Speicherverwaltung |
127 |
|
|
weak und unowned |
129 |
|
|
weak-Beispiel |
129 |
|
|
4 Arrays, Dictionaries, Sets und Tupel |
133 |
|
|
4.1 Arrays |
133 |
|
|
Arrays initialisieren |
134 |
|
|
Array-Elemente auslesen |
135 |
|
|
Arrays manipulieren |
137 |
|
|
Arrays sortieren |
138 |
|
|
Interna und Geschwindigkeitsüberlegungen |
139 |
|
|
Array-Elemente verarbeiten |
139 |
|
|
Array-Algorithmen |
141 |
|
|
Mehrdimensionale Arrays |
142 |
|
|
4.2 Dictionaries |
143 |
|
|
Dictionaries deklarieren und initialisieren |
143 |
|
|
Zugriff auf Dictionary-Elemente |
144 |
|
|
4.3 Sets |
145 |
|
|
4.4 Option-Sets (OptionSetType) |
146 |
|
|
Anwendungsbeispiel |
147 |
|
|
Eigene Option-Sets definieren |
148 |
|
|
4.5 Tupel |
149 |
|
|
Anwendungen |
150 |
|
|
5 Verzweigungen und Schleifen |
153 |
|
|
5.1 Verzweigungen mit if |
153 |
|
|
if |
153 |
|
|
if-let-Kombination für Optionals |
154 |
|
|
if-let-Kombination mit where |
155 |
|
|
Inverse Logik mit guard |
156 |
|
|
Versionsabhängige Code-Teile |
158 |
|
|
5.2 Verzweigungen mit switch |
158 |
|
|
switch für Tupel |
160 |
|
|
case-let-Kombination mit where |
161 |
|
|
5.3 Schleifen |
162 |
|
|
for |
162 |
|
|
for-in |
163 |
|
|
while |
164 |
|
|
while-let-Kombination |
164 |
|
|
repeat-while |
165 |
|
|
break |
165 |
|
|
continue |
166 |
|
|
5.4 Lottosimulator |
166 |
|
|
Version 1: elegant, aber langsam |
167 |
|
|
Einige Benchmarktests |
169 |
|
|
Version 2: Swift zeigt, was es kann |
170 |
|
|
6 Funktionen und Closures |
173 |
|
|
6.1 Funktionen definieren und ausführen |
173 |
|
|
Benannte Parameter |
174 |
|
|
Rückgabewerte |
175 |
|
|
Aufräumarbeiten automatisch ausführen (defer) |
177 |
|
|
Funktionsnamen |
179 |
|
|
Gültigkeitsebenen |
179 |
|
|
Verschachtelte Funktionen |
180 |
|
|
Rekursion |
181 |
|
|
6.2 Parameter |
182 |
|
|
Gewöhnliche Parameter |
183 |
|
|
Veränderliche Parameter |
184 |
|
|
Inout-Parameter |
184 |
|
|
Benannte Parameter |
185 |
|
|
Differenzierung zwischen externen und internen Parameternamen |
185 |
|
|
Auch den ersten Parameter benennen |
186 |
|
|
Unbenannten Parameter erzwingen |
187 |
|
|
Optionale Parameter und Defaultwerte |
187 |
|
|
Variable Parameteranzahl (Variadics) |
189 |
|
|
6.3 Standardfunktionen |
189 |
|
|
min und max |
190 |
|
|
print und readline |
191 |
|
|
swap |
191 |
|
|
zip |
192 |
|
|
Mathematische Funktionen |
192 |
|
|
6.4 Standardmethoden und Standardeigenschaften |
193 |
|
|
Von der globalen Funktion zur Methode |
194 |
|
|
count |
194 |
|
|
first und last |
195 |
|
|
prefix und suffix |
195 |
|
|
dropFirst und dropLast |
195 |
|
|
startsWith, contains und indexOf |
196 |
|
|
advancedBy und distanceTo |
197 |
|
|
split und joinWithSeparator |
197 |
|
|
filter, map und reduce |
198 |
|
|
forEach |
200 |
|
|
sort und reverse |
201 |
|
|
6.5 Funktionale Programmierung |
201 |
|
|
Funktionen als eigener Datentyp |
202 |
|
|
Funktionen als Parameter und Rückgabeergebnisse |
203 |
|
|
6.6 Closures |
206 |
|
|
Syntax |
206 |
|
|
Auto-Closures |
209 |
|
|
RPN-Rechner |
210 |
|
|
Capturing Values |
211 |
|
|
Gefahr von Memory Leaks (Capture Lists) |
213 |
|
|
Closure-Speicherung und -Weitergabe verhindern (@noescape) |
213 |
|
|
7 Objektorientierte Programmierung I |
217 |
|
|
7.1 Klassen und Strukturen |
218 |
|
|
Auch Enumerationen sind Datentypen! |
219 |
|
|
Glossar |
219 |
|
|
Syntax |
220 |
|
|
Das Schlüsselwort »self« |
222 |
|
|
Zugriffsebenen und Zugriffssteuerung |
222 |
|
|
Modifizierer |
224 |
|
|
Verschachtelte Klassen, Strukturen und Enumerationen |
224 |
|
|
Code-Dateien |
225 |
|
|
7.2 Enumerationen |
225 |
|
|
Datentypen und Protokolle für Enumerationen |
226 |
|
|
Zuordnung von Zusatzdaten (Associated Values) |
227 |
|
|
Rekursive bzw. indirekte Enumerationen |
228 |
|
|
7.3 Eigenschaften |
230 |
|
|
Verzögerte Initialisierung von Eigenschaften (Lazy Properties) |
231 |
|
|
Eigenschaften beobachten (willSet, didSet) |
232 |
|
|
Statische Eigenschaften |
234 |
|
|
Computed Properties (get und set) |
235 |
|
|
Temperaturumrechnung mit Computed Properties |
235 |
|
|
Read-Only-Eigenschaften |
236 |
|
|
Beispiel: Rectangle-Struktur |
237 |
|
|
Beispiel: ChessFigure-Struktur |
239 |
|
|
7.4 Init- und DeInit-Funktion |
241 |
|
|
Syntax für Init-Funktionen |
242 |
|
|
Parameterliste |
242 |
|
|
Code-Reihenfolge in Init-Funktionen |
243 |
|
|
Overloading |
243 |
|
|
Designated versus Convenience Init |
244 |
|
|
Init-Funktion als Optional (Failable Init Functions) |
245 |
|
|
Deinit-Funktion |
246 |
|
|
7.5 Methoden |
246 |
|
|
Instanzmethoden |
247 |
|
|
Mutating Methods |
248 |
|
|
Statische Methoden |
250 |
|
|
Benannte Parameter |
251 |
|
|
Benannte Parameter in globalen Funktionen, Init-Funktionen und Methoden |
253 |
|
|
Signaturen von Methoden |
253 |
|
|
7.6 Subscripts |
255 |
|
|
Beispiel: Schachbrett |
256 |
|
|
8 Objektorientierte Programmierung II |
259 |
|
|
8.1 Vererbung |
259 |
|
|
Mehrfachvererbung |
260 |
|
|
Vererbung versus Protokolle versus Extensions |
260 |
|
|
Das Schlüsselwort override |
261 |
|
|
Das Schlüsselwort super |
263 |
|
|
Das Schlüsselwort final |
264 |
|
|
Initialisierung |
265 |
|
|
Das Schlüsselwort required |
266 |
|
|
Redundanz in Init-Funktionen vermeiden |
267 |
|
|
Generalisierung, Polymorphie und Casting |
268 |
|
|
8.2 Generics |
270 |
|
|
Syntax |
271 |
|
|
Generics in der Swift-Standardbibliothek |
271 |
|
|
Regeln für generische Typen (Type Constraints) |
273 |
|
|
8.3 Protokolle |
274 |
|
|
Vorhandene Protokolle implementieren |
275 |
|
|
Selbst Protokolle definieren |
276 |
|
|
Protokolle sind Datentypen |
278 |
|
|
Beispiel |
278 |
|
|
Optionale Protokollanforderungen |
280 |
|
|
Generische Protokolle mit »typealias« |
281 |
|
|
8.4 Standardprotokolle |
283 |
|
|
CustomStringConvertible (ehemals Printable) |
283 |
|
|
Hashable und Equatable |
285 |
|
|
Comparable |
286 |
|
|
Any und AnyObject |
287 |
|
|
AnyClass |
289 |
|
|
StringLiteralConvertible |
289 |
|
|
8.5 Extensions |
291 |
|
|
Syntax |
292 |
|
|
Übersichtlicherer Code durch Extensions |
294 |
|
|
Beispiel: Rechnen mit Kilo-, Mega- und Gigabyte |
295 |
|
|
8.6 Protokollerweiterungen |
296 |
|
|
Bedingte Protokollerweiterungen |
297 |
|
|
Beispiel: Die uniqueElements-Methode |
298 |
|
|
Beispiel: Die uniqueSet-Methode |
300 |
|
|
8.7 Metatypen |
301 |
|
|
8.8 Header-Code einer eigenen Bibliothek erzeugen |
302 |
|
|
9 Fehlerabsicherung und Spezialfunktionen |
305 |
|
|
9.1 Fehlerabsicherung (try/catch) |
305 |
|
|
Swifts Verhalten beim Auftreten von Fehlern |
305 |
|
|
try-catch-Syntax |
306 |
|
|
Einführungsbeispiel |
307 |
|
|
Reaktion auf Fehler mit catch |
308 |
|
|
Selbst Fehler auslösen (throws und throw) |
310 |
|
|
Fehler in Init-Funktionen auslösen |
311 |
|
|
Fehler in Computed Properties |
313 |
|
|
Das ErrorType-Protokoll |
313 |
|
|
try ohne do-catch |
315 |
|
|
try! und try? (Forced Try und Optional Try) |
315 |
|
|
Parameterabsicherung mit guard |
315 |
|
|
Aufräumarbeiten mit defer |
316 |
|
|
assert |
317 |
|
|
9.2 Fehlerabsicherung von API-Methoden (NSError) |
318 |
|
|
Die NSError-Klasse |
319 |
|
|
Die NSException-Klasse |
320 |
|
|
9.3 Module, Frameworks und Importe |
320 |
|
|
Selbst Frameworks erzeugen |
321 |
|
|
9.4 Attribute |
322 |
|
|
9.5 Systemfunktionen aufrufen |
323 |
|
|
TEIL II iOS |
325 |
|
|
10 Hello iOS-World! |
327 |
|
|
10.1 Projektstart |
328 |
|
|
10.2 Gestaltung der App |
329 |
|
|
Mini-Glossar |
329 |
|
|
Steuerelemente einfügen |
330 |
|
|
Ein erster Test mit dem iOS-Simulator |
332 |
|
|
10.3 Steuerung der App durch Code |
334 |
|
|
Den Button mit einer Methode verbinden (Actions) |
334 |
|
|
Zugriff auf das Textfeld über eine Eigenschaft (Outlets) |
336 |
|
|
Endlich eigener Code |
337 |
|
|
10.4 Actions und Outlets für Fortgeschrittene |
339 |
|
|
Eine Action für mehrere Steuerelemente |
339 |
|
|
Ein Outlet für mehrere Steuerelemente (Outlet Collections) |
339 |
|
|
Actions oder Outlets umbenennen |
339 |
|
|
Steuerelemente kopieren |
341 |
|
|
10.5 Layout optimieren |
341 |
|
|
Layoutregeln |
341 |
|
|
Layoutregeln für den »Hello-World«-Button |
342 |
|
|
Layoutregeln für das Textfeld |
344 |
|
|
Wenn es Probleme gibt |
345 |
|
|
10.6 Textgröße mit einem Slider einstellen |
346 |
|
|
Das Slider-Steuerelement hinzufügen |
346 |
|
|
Den Slider mit einer Methode verbinden |
347 |
|
|
10.7 Apps auf dem eigenen iPhone/iPad ausführen |
348 |
|
|
Apple Developer Program |
349 |
|
|
10.8 Komponenten und Dateien eines Xcode-Projekts |
350 |
|
|
Weitere Dateien |
351 |
|
|
Test- und Produktgruppe |
352 |
|
|
11 iOS-Grundlagen |
353 |
|
|
11.1 Model-View-Controller (MVC) |
353 |
|
|
Kommunikation in MVC-Apps |
355 |
|
|
MVC bei Apps mit mehreren Dialogen |
356 |
|
|
11.2 Klassenhierarchie einer App-Ansicht |
357 |
|
|
11.3 Die UIViewController-Klasse |
361 |
|
|
Lebenszyklus eines View-Controllers |
361 |
|
|
Init-Funktion |
362 |
|
|
viewDidLoad-Methode |
363 |
|
|
11.4 Phasen einer iOS-App |
365 |
|
|
Die AppDelegate-Klasse |
365 |
|
|
Zugriff auf den Root-View-Controller und das AppDelegate-Objekt |
367 |
|
|
11.5 Auto Layout |
368 |
|
|
Grundeinstellungen |
368 |
|
|
Viele Wege führen zum Ziel |
369 |
|
|
Live-Vorschau in der Preview-Ansicht |
370 |
|
|
Layoutregeln im Storyboard-Editor einstellen |
372 |
|
|
Layoutregeln manuell einstellen |
373 |
|
|
Layoutregeln aus der aktuellen Position und Größe ableiten |
375 |
|
|
Regeln ändern und löschen, Steuerelemente neu positionieren |
376 |
|
|
Layoutprobleme in der Document-Outline-Seitenleiste beheben |
377 |
|
|
Layoutregeln im Size Inspector bearbeiten |
378 |
|
|
Layoutdetails im Attributinspektor modifizieren |
380 |
|
|
Layouts für verschiedene iOS-Geräteklassen (Size Classes) |
380 |
|
|
Tipps und Tricks |
383 |
|
|
Layoutregeln mit Code definieren |
384 |
|
|
11.6 Steuerelemente in einer Stack-View anordnen |
386 |
|
|
Funktionsprinzip |
387 |
|
|
Beispiel |
388 |
|
|
Content Compression Resistance Priority |
389 |
|
|
11.7 Daten persistent speichern |
390 |
|
|
User-Defaults |
391 |
|
|
Umgang mit Dateien |
393 |
|
|
Zugriff auf Bundle-Dateien |
394 |
|
|
Beispiel |
395 |
|
|
11.8 Mehrsprachige Apps |
398 |
|
|
Localization versus Internationalization |
398 |
|
|
Defaulteinstellungen in Xcode |
399 |
|
|
Deutsch als primäre Sprache einstellen |
399 |
|
|
Sprache hinzufügen |
401 |
|
|
Lokalisierungsdateien exportieren |
402 |
|
|
Lokalisierungsdateien bearbeiten |
402 |
|
|
Übersetzte Dateien wieder importieren |
404 |
|
|
Die App in verschiedenen Lokalisierungen ausprobieren |
404 |
|
|
Internationalisierung im Code |
404 |
|
|
11.9 iOS-Crashlogs |
407 |
|
|
12 Apps mit mehreren Ansichten |
409 |
|
|
12.1 Storyboard und Controller-Klassen verbinden |
409 |
|
|
12.2 Ansichten durch Segues verbinden |
411 |
|
|
Welcher Segue-Typ ist der richtige? |
412 |
|
|
Zurück an den Start mit Unwind |
413 |
|
|
12.3 Segues mit Datenübertragung |
415 |
|
|
Segue-Code für »View 1« |
417 |
|
|
Segue-Code für »View 2« |
418 |
|
|
Segues per Code auslösen |
419 |
|
|
12.4 Tastatureingaben mit Delegation verarbeiten |
420 |
|
|
Beispiel |
421 |
|
|
12.5 Navigation-Controller |
422 |
|
|
Funktionsweise |
422 |
|
|
Einstellungen |
423 |
|
|
Steuerung per Code |
424 |
|
|
Beispiel |
425 |
|
|
12.6 Tab-Bar-Controller |
426 |
|
|
Tab-Bar-Items |
427 |
|
|
Kombination aus Tab-Bar- und Navigation-Controller |
429 |
|
|
Programmierung |
430 |
|
|
12.7 Bild-Management in Images.xcasset |
432 |
|
|
Zugriff auf Images.xcasset per Code |
433 |
|
|
App-Icon |
434 |
|
|
13 GPS- und Kompassfunktionen |
435 |
|
|
13.1 Hello MapView! |
435 |
|
|
MapKit-Framework |
435 |
|
|
Um Erlaubnis fragen |
435 |
|
|
Info.plist-Einstellungen |
437 |
|
|
Erste Tests |
438 |
|
|
Kartenfunktionen im iOS-Simulator |
439 |
|
|
13.2 Wegstrecke aufzeichnen |
440 |
|
|
Programmaufbau und Auto Layout |
440 |
|
|
Die ViewController-Klasse |
441 |
|
|
Initialisierung in viewDidLoad |
442 |
|
|
locationManager-Delegate |
443 |
|
|
Die mapView-Methode |
446 |
|
|
Erweiterungsmöglichkeiten |
446 |
|
|
13.3 Kompassfunktionen |
447 |
|
|
Kompasskalibrierung |
448 |
|
|
Grafische Darstellung eines Kompasses |
449 |
|
|
13.4 Eigene Steuerelemente mit Grafikfunktionen |
449 |
|
|
Eine Klasse für ein neues Steuerelement |
449 |
|
|
Grafikprogrammierung |
450 |
|
|
Das Steuerelement verwenden |
451 |
|
|
Eine richtige CompassView |
452 |
|
|
Automatischer Redraw bei Größenänderung |
455 |
|
|
Kompassnadel einstellen |
456 |
|
|
Den Kompass an die Ausrichtung des Geräts anpassen |
456 |
|
|
Xcode-Integration mit IBDesignable und IBInspectable |
458 |
|
|
14 To-do-Listen |
461 |
|
|
14.1 Popups |
461 |
|
|
Hello Popup! |
461 |
|
|
Popups auch auf dem iPhone |
463 |
|
|
Größe des Popups einstellen |
464 |
|
|
Popup-Richtung festlegen |
466 |
|
|
Popups per Code anzeigen und entfernen |
467 |
|
|
Unwind für Popups |
469 |
|
|
dismissViewControllerAnimated-Methode |
470 |
|
|
14.2 Ja-Nein-Dialoge (UIAlertController) |
470 |
|
|
14.3 Listen (UITableView) |
472 |
|
|
Hello UITableView! |
473 |
|
|
Listenzellen mit Bild und Zusatzinformationen |
478 |
|
|
14.4 Individuelle Gestaltung der Listenelemente (UITableViewCell) |
481 |
|
|
Detailansicht zu Listeneinträgen |
484 |
|
|
14.5 Veränderliche Listen |
487 |
|
|
Die Methode reloadData |
487 |
|
|
Edit-Modus |
488 |
|
|
Gestaltung der Benutzeroberfläche |
488 |
|
|
Beispiele |
488 |
|
|
14.6 To-do-App |
489 |
|
|
Auto Layout |
489 |
|
|
Datenmodell |
490 |
|
|
Outlets und Initialisierung |
491 |
|
|
Button- und Gesture-Methoden |
492 |
|
|
Popup-Dialog anzeigen |
494 |
|
|
Listeneintrag hinzufügen oder ändern |
495 |
|
|
DataSource-Methoden |
496 |
|
|
Popup-View-Controller |
498 |
|
|
15 Schatzsuche |
501 |
|
|
15.1 Aufbau der App |
501 |
|
|
Aufbau und Storyboard |
503 |
|
|
Layout-Regeln |
503 |
|
|
Funktion zur Darstellung geografischer Daten |
504 |
|
|
Projekteinstellungen |
505 |
|
|
15.2 Datenmodell |
505 |
|
|
Basisklasse und Protokolle |
506 |
|
|
description-Eigenschaft |
506 |
|
|
Das Protokoll NSCoding |
507 |
|
|
Array speichern und wieder einlesen (NSKeyedArchiver) |
507 |
|
|
15.3 Location Manager selbst gemacht |
509 |
|
|
Die Init-Funktion |
509 |
|
|
Kommunikation über das Notification Center |
510 |
|
|
15.4 Steuerelement zur Richtungsanzeige (UIBezierPath) |
513 |
|
|
15.5 Hauptansicht mit Listenfeld |
514 |
|
|
Outlets, Eigenschaften und Initialisierung |
514 |
|
|
DataSource-Anbindung |
515 |
|
|
Segues vom und zum Speichern-Popup, neuen Eintrag speichern |
516 |
|
|
Segue vom und zum Detaildialog |
518 |
|
|
15.6 Popup-Dialog zum Speichern |
519 |
|
|
15.7 Detailansicht mit Richtungspfeil |
520 |
|
|
Auto Layout |
521 |
|
|
Initialisierung der Controller-Klasse |
522 |
|
|
Abstand und Richtung zum Zielpunkt errechnen |
523 |
|
|
Listeneintrag löschen bzw. ändern |
524 |
|
|
16 Währungskalkulator |
527 |
|
|
16.1 App-Überblick |
527 |
|
|
Storyboard und Klassen |
529 |
|
|
Auto Layout in der Umrechnungsansicht |
529 |
|
|
Auto Layout in der Einstellungsansicht |
531 |
|
|
Layout-Variante mit Stack-Views |
532 |
|
|
Bildkataloge |
534 |
|
|
Erweiterungsmöglichkeiten |
534 |
|
|
16.2 XML-Dokumente lesen |
535 |
|
|
XML-Datei herunterladen |
535 |
|
|
Die SWXMLHash-Bibliothek |
538 |
|
|
16.3 Das Datenmodell der App |
540 |
|
|
Init-Funktion |
540 |
|
|
Wechselkurse im Cache-Verzeichnis speichern |
541 |
|
|
Kursumrechnung |
543 |
|
|
Länderkürzel aus Währungskürzeln extrahieren |
543 |
|
|
16.4 Umrechnungsansicht |
543 |
|
|
Property Observer für die Währungskürzel |
544 |
|
|
Initialisierung in viewDidLoad |
545 |
|
|
Das CurCalc-Objekt initialisieren und das Datum der Kurse anzeigen |
546 |
|
|
Ungültige Tastatureingaben vermeiden |
547 |
|
|
Tap Gesture Recognizer |
548 |
|
|
Währungsumrechnung bei der Texteingabe |
549 |
|
|
16.5 Einstellungsansicht |
550 |
|
|
Picker-Views (UIPickerView-Klasse) |
550 |
|
|
Outlets, Eigenschaften und viewDidLoad |
550 |
|
|
Picker-View mit Daten füllen |
552 |
|
|
Auswahl eines Picker-View-Elements |
554 |
|
|
16.6 Startansicht (Launch Screen) |
555 |
|
|
16.7 App-Icon |
556 |
|
|
App-Name |
557 |
|
|
16.8 Internationalisierung und Lokalisierung |
557 |
|
|
16.9 App im App Store einreichen |
558 |
|
|
App-Store-Regeln |
559 |
|
|
Bundle-ID (Xcode) |
560 |
|
|
App-ID erzeugen (Apple Developer) |
560 |
|
|
App einrichten (iTunes Connect) |
561 |
|
|
App-Daten ausfüllen (iTunes Connect) |
563 |
|
|
Distribution Provisioning Profile erzeugen (Apple Developer) |
564 |
|
|
App-Upload (Xcode) |
566 |
|
|
Warten auf das Okay von Apple |
566 |
|
|
17 Fünf Gewinnt |
569 |
|
|
17.1 Einfache Animationen |
569 |
|
|
Hello World! |
569 |
|
|
Fade-In-Effekt |
571 |
|
|
Steuerelemente animiert erscheinen und verschwinden lassen |
572 |
|
|
17.2 Die App »5 Gewinnt« |
574 |
|
|
Hintergründe zum Spiel |
576 |
|
|
Programmaufbau |
576 |
|
|
Storyboard und Auto-Layout-Regeln |
576 |
|
|
17.3 Enumerationen und globale Funktionen (Globals.swift) |
577 |
|
|
Feld- und Spielstatus (Piece und GameStatus) |
577 |
|
|
Spielbrettgrößen (BoardSize) |
578 |
|
|
2D-Arrays erzeugen |
579 |
|
|
Farben aufhellen bzw. abdunkeln |
580 |
|
|
Rechteck rund um Mittelpunkt erzeugen |
580 |
|
|
Code verzögert ausführen |
581 |
|
|
17.4 Die Spiellogik (FiveWins.swift) |
582 |
|
|
Spielfeld speichern |
582 |
|
|
Zug ausführen und rückgängig machen |
583 |
|
|
Sieg-Test |
584 |
|
|
Der Spielalgorithmus |
586 |
|
|
Den Wert einer Linie berechnen |
588 |
|
|
Wert aller Linien berechnen |
589 |
|
|
Den Wert eines Spielfelds berechnen |
590 |
|
|
Den besten Zug auswählen |
592 |
|
|
17.5 Darstellung des Spielbretts und der Steine (BoardView.swift) |
593 |
|
|
Eigenschaften |
593 |
|
|
Reset |
596 |
|
|
Spielbrett zeichnen |
596 |
|
|
Zug ausführen |
597 |
|
|
Einen Spielstein als (animierte) View darstellen |
598 |
|
|
Steine neu positionieren |
600 |
|
|
Benutzereingaben feststellen und weiterleiten |
601 |
|
|
17.6 Steuerung des Spielablaufs (ViewController.swift) |
603 |
|
|
Ein neues Spiel starten |
604 |
|
|
Warten auf den nächsten Zug |
605 |
|
|
Aktualisierung des Labels und der Statusvariablen |
606 |
|
|
Undo |
607 |
|
|
Popup-Aufruf |
607 |
|
|
17.7 Der Popup-Dialog (PopupVC.swift) |
609 |
|
|
Neues Spiel starten, Zug rückgängig machen |
610 |
|
|
Einstellungen ändern |
610 |
|
|
Dialog schließen unter iOS 7 |
611 |
|
|
17.8 Erweiterungsmöglichkeiten |
611 |
|
|
Spielstand automatisch speichern |
611 |
|
|
Spielstärke |
612 |
|
|
Animationen und Audio-Effekte |
612 |
|
|
Optische Gestaltung |
613 |
|
|
Geld verdienen |
613 |
|
|
TEIL III OS X |
615 |
|
|
18 Hello OS-X-World! |
617 |
|
|
18.1 Von iOS zu OS X |
617 |
|
|
Gemeinsamkeiten |
617 |
|
|
Unterschiede |
618 |
|
|
Window- versus View-Controller |
618 |
|
|
Storyboards |
619 |
|
|
18.2 Lottozahlengenerator (Storyboard-Variante) |
620 |
|
|
Projekt einrichten |
620 |
|
|
Gestaltung der Benutzeroberfläche |
621 |
|
|
Effizient arbeiten mit Kopieren und Einfügen |
622 |
|
|
Fenstergröße und Fenstertitel einstellen |
623 |
|
|
viewDidLoad und representedObject |
625 |
|
|
Outlets und Actions |
626 |
|
|
Die Lotto-Klasse |
627 |
|
|
Die View-Controller-Klasse |
627 |
|
|
Programmende |
629 |
|
|
18.3 Lottozahlengenerator (XIB/AppDelegate-Variante) |
630 |
|
|
XIB-Dateien |
630 |
|
|
Organisation des Projekts |
630 |
|
|
Die AppDelegate-Klasse |
631 |
|
|
Eigener Code |
632 |
|
|
Programmende |
634 |
|
|
18.4 Lottozahlengenerator (XIB/WindowController-Variante) |
635 |
|
|
Window-Controller mit XIB-Datei |
635 |
|
|
Das Fenster in der AppDelegate-Klasse anzeigen |
636 |
|
|
Windows-Controller-Code |
637 |
|
|
Programmende |
638 |
|
|
18.5 Lottozahlengenerator (XIB/ViewController-Variante) |
639 |
|
|
Das Fenster mit dem View-Controller verbinden |
640 |
|
|
Controller-Code |
641 |
|
|
19 OS-X-Grundlagen |
643 |
|
|
19.1 Programme mit mehreren Fenstern |
643 |
|
|
Segues |
645 |
|
|
Datenübergabe mit der Methode prepareForSegue |
646 |
|
|
Fenstergröße fixieren |
648 |
|
|
Window-Eigenschaften des Ziel-Controllers einstellen |
649 |
|
|
Ansichten/Fenster schließen |
649 |
|
|
Segues per Code ausführen |
650 |
|
|
Fenster per Code erzeugen |
650 |
|
|
19.2 Tab-View-Controller |
651 |
|
|
Storyboard und Tab-View-Controller-Einstellungen |
653 |
|
|
Dialogblattgröße |
654 |
|
|
Segues |
654 |
|
|
Splitter-Steuerelement |
655 |
|
|
Klassen |
655 |
|
|
Application Defaults mit den User-Defaults verbinden (AppDelegate.swift) |
655 |
|
|
Textgröße aus den User-Defaults lesen (ViewController.swift) |
657 |
|
|
Einstellungen ändern (SettingsGeneralVC.swift) |
658 |
|
|
User-Defaults-Interna |
659 |
|
|
19.3 Standarddialoge |
660 |
|
|
Nachrichten anzeigen und Ja/Nein-Entscheidungen treffen |
661 |
|
|
Datei- und Verzeichnisauswahl |
661 |
|
|
Schrift einstellen |
662 |
|
|
Farbe einstellen |
663 |
|
|
19.4 Maus |
664 |
|
|
Mausereignisse |
665 |
|
|
Koordinatensysteme, Bounds und Frames |
665 |
|
|
Mausposition ergründen |
666 |
|
|
Statustasten |
667 |
|
|
Beispielprogramm |
667 |
|
|
Die MyView-Klasse |
668 |
|
|
Die drawRect-Methode |
669 |
|
|
Die mouseDown-Methode |
671 |
|
|
19.5 Tastatur |
672 |
|
|
Die NSResponder-Klasse |
673 |
|
|
Tastaturereignisse |
674 |
|
|
Beispielprogramm |
675 |
|
|
19.6 Menüs |
678 |
|
|
Die Responder-Kette |
678 |
|
|
Gestaltung der Menüleiste |
680 |
|
|
Responder-Aktionen |
681 |
|
|
Menüaktionen in der AppDelegate-Klasse |
681 |
|
|
Menüaktionen in eigenen View-Klassen |
683 |
|
|
Veränderung von Menüeinträgen per Code |
684 |
|
|
Kontextmenüs |
685 |
|
|
19.7 Programme ohne Menü |
686 |
|
|
Menubar-Apps |
687 |
|
|
Die AppDelegate-Klasse |
687 |
|
|
View-Controller |
689 |
|
|
19.8 Bindings |
689 |
|
|
Hello Bindings! |
690 |
|
|
Sonderfälle |
691 |
|
|
20 Icon-Resizer |
693 |
|
|
20.1 Tabellen (NSTableView) |
693 |
|
|
Hello NSTableView! |
694 |
|
|
Table-View mit eigenen Views |
697 |
|
|
Programmaufbau und Country-Klasse |
699 |
|
|
Table-View-Code |
700 |
|
|
Die Tabelle mit Daten füllen |
700 |
|
|
Tabelle sortieren |
703 |
|
|
Auswahl einer Zeile |
704 |
|
|
20.2 Drag & Drop |
704 |
|
|
Drag-Operationen empfangen (NSDraggingDestination) |
705 |
|
|
Drag-Operationen initiieren (NSDraggingSource) |
706 |
|
|
Beispielprogramm |
706 |
|
|
Projektaufbau |
707 |
|
|
View-Controller |
707 |
|
|
Die MyView-Klasse |
708 |
|
|
Drag & Drop initiieren |
710 |
|
|
Drag & Drop-Empfang zulassen |
713 |
|
|
Drag & Drop-Empfang verarbeiten |
716 |
|
|
20.3 Icon-Resizer |
717 |
|
|
Programmaufbau |
719 |
|
|
Das Split-View-Steuerelement |
719 |
|
|
Layoutregeln für das Hauptfenster |
720 |
|
|
Popup-Menü |
721 |
|
|
Erweiterungsmöglichkeiten |
722 |
|
|
20.4 Arbeiten mit Bitmaps (IconSize-Struktur) |
722 |
|
|
Enumerationen |
722 |
|
|
IconSize-Struktur |
723 |
|
|
Initialisierung von IconSize-Arrays |
723 |
|
|
Bitmaps skalieren |
724 |
|
|
Bitmaps im PNG-Format speichern |
727 |
|
|
20.5 Hauptfenster (ViewController.swift) |
728 |
|
|
viewDidLoad mit dem Aufruf von unregisterDraggedTypes |
729 |
|
|
Popup- und Speicher-Buttons, Programmende |
730 |
|
|
Split-View-Delegation |
732 |
|
|
Table-View-Datenquelle |
732 |
|
|
20.6 Drag & Drop-Quelle für Icons (IconCellView.swift) |
735 |
|
|
20.7 Drag & Drop-Empfänger für Icons (OriginalIconView.swift) |
736 |
|
|
Drag & Drop einer Bilddatei empfangen |
737 |
|
|
Dateiauswahldialog für die Bilddatei |
738 |
|
|
20.8 Popup-Menü (IconChoiceVC.swift) |
739 |
|
|
20.9 Temporäres Verzeichnis erstellen und löschen (AppDelegate.swift) |
740 |
|
|
Ein eigenes temporäres Verzeichnis einstellen |
741 |
|
|
Temporäres Verzeichnis löschen |
742 |
|
|
20.10 OS-X-Programme weitergeben |
742 |
|
|
Programme signieren und archivieren |
743 |
|
|
Programme in einem DMG-Image verpacken |
745 |
|
|
Index |
747 |
|