Inhalt | 8 |
Vorwort | 22 |
Danksagung | 26 |
1 Über iOS | 28 |
1.1 Was ist iOS? | 28 |
1.1.1 iOS und macOS | 29 |
1.1.2 Besonderheiten der iOS-Plattform | 30 |
1.2 iOS für Entwickler | 31 |
1.2.1 Hardware für Entwickler | 31 |
1.2.2 Software für Entwickler | 33 |
1.2.3 Das Apple Developer Program | 33 |
1.3 Der Aufbau von iOS | 35 |
1.3.1 Die vier Schichten von iOS | 35 |
1.4 Die perfekte iOS-App | 37 |
1.4.1 iOS Human Interface Guidelines | 38 |
2 Die (bisherige) Programmiersprache – Objective-C | 40 |
2.1 Über Objective-C und objektorientierte Programmierung | 40 |
2.2 Grundlagen der Programmierung | 41 |
2.2.1 Objekte | 41 |
2.2.2 Primitive Datentypen | 41 |
2.2.3 Variablen | 42 |
2.2.4 Operatoren | 44 |
2.2.5 Abfragen und Schleifen | 44 |
2.2.6 Kommentare | 49 |
2.3 Aufbau einer Klasse | 50 |
2.3.1 Die Header-Datei | 50 |
2.3.2 Die Implementation-Datei | 52 |
2.3.3 Los geht’s: Unsere erste Klasse! | 53 |
2.4 Methoden | 57 |
2.4.1 Aufbau von Methoden | 57 |
2.4.2 Methoden in Header- und Implementation-Dateien einer Klasse | 59 |
2.4.3 Implementierung von Methoden | 61 |
2.4.4 Methoden aufrufen | 63 |
2.4.5 Klassen- und Instanzmethoden | 64 |
2.5 Instanzvariablen | 65 |
2.6 Properties | 67 |
2.6.1 Aufbau einer Property | 67 |
2.6.2 Die Punktnotation | 69 |
2.6.3 Optionen | 70 |
2.6.4 Direktzugriff auf Properties | 72 |
2.6.5 Setter und Getter überschreiben | 74 |
2.7 Konstanten | 76 |
2.7.1 Deklaration von Konstanten | 77 |
2.8 Namenskonventionen | 78 |
2.8.1 Klassen | 78 |
2.8.2 Methoden | 78 |
2.8.3 Properties | 79 |
2.9 Strukturen | 79 |
2.9.1 enum | 79 |
2.9.2 typedef | 80 |
2.10 Initialisierung von Objekten | 81 |
2.10.1 alloc und init | 82 |
2.10.2 Zeiger | 84 |
2.11 init im Detail | 85 |
2.11.1 Erstellen eigener init-Methoden | 87 |
2.11.2 Designated Initializer | 88 |
2.12 Vererbung | 90 |
2.12.1 Methoden der Superklasse überschreiben | 92 |
2.13 Kategorien | 94 |
2.13.1 Aufbau von Kategorien | 94 |
2.13.2 Kategorien in Xcode erstellen | 95 |
2.13.3 Verwenden von Kategorien | 97 |
2.14 Erweiterungen | 97 |
2.14.1 Aufbau von Erweiterungen | 98 |
2.14.2 Erweiterungen innerhalb der Implementation-Datei | 98 |
2.14.3 Erweiterungen in Xcode erstellen | 99 |
2.15 Protokolle | 100 |
2.15.1 Aufbau von Protokollen | 101 |
2.15.2 Zuweisen eines Protokolls zu einer Klasse | 102 |
2.15.3 Vererbung in Protokollen | 103 |
2.15.4 Protokolle in Xcode erstellen | 103 |
2.16 #import und @class | 105 |
2.16.1 #import | 105 |
2.16.2 @class | 106 |
2.17 Blöcke | 107 |
2.17.1 Was sind Blöcke? | 108 |
2.17.2 Aufbau eines Blocks | 108 |
2.17.3 Zuweisen eines Blocks zu einer Variablen | 109 |
2.17.4 Nutzen eines Blocks als Parameter einer Methode | 110 |
2.17.5 Blöcke als Properties | 112 |
2.17.6 Blockvariablen | 112 |
2.17.7 Globale Blöcke | 113 |
2.18 Singletons | 114 |
3 Der Neue im Club – Swift | 116 |
3.1 Programmierst du noch oder swifst du schon? | 116 |
3.1.1 Über Swift | 116 |
3.1.2 Voraussetzungen zur Nutzung von Swift | 117 |
3.1.3 Swift und Objective-C | 117 |
3.1.4 Playgrounds | 118 |
3.2 Grundlagen der Programmierung | 120 |
3.2.1 Swift Standard Library und Fundamental Types | 120 |
3.2.2 Variablen und Konstanten | 122 |
3.2.3 Operatoren | 124 |
3.2.4 Abfragen und Schleifen | 125 |
3.2.5 Kommentare | 132 |
3.2.6 print | 133 |
3.3 Fundamental Types und Swift Standard Library im Detail | 135 |
3.3.1 Strings | 135 |
3.3.2 Arrays | 138 |
3.3.3 Dictionaries | 143 |
3.3.4 Any und AnyObject | 147 |
3.4 Aufbau einer Klasse | 147 |
3.4.1 Erstellen einer Instanz einer Klasse | 150 |
3.4.2 Zugriff auf Eigenschaften einer Klasse | 150 |
3.5 Methoden | 151 |
3.5.1 Methoden mit Rückgabewert | 152 |
3.5.2 Methoden mit Parametern | 153 |
3.5.3 Local und External Parameter Names | 156 |
3.5.4 Methodennamen in Swift | 158 |
3.5.5 Aufruf von Methoden einer Klasse | 159 |
3.5.6 Zugriff auf andere Eigenschaften und Methoden einer Klasse | 160 |
3.5.7 Klassen- und Instanzmethoden | 161 |
3.5.8 Verändern von Parametern einer Methode mittels inout | 163 |
3.6 Closures | 164 |
3.6.1 Closures als Variablen und Konstanten | 166 |
3.6.2 Closures als Parameter für Methoden | 167 |
3.6.3 Kurzschreibweise für Closures als Parameter von Methoden | 170 |
3.7 Properties | 173 |
3.7.1 Computed Properties | 174 |
3.7.2 Property Observers | 177 |
3.7.3 Type Properties | 178 |
3.8 Vererbung | 179 |
3.8.1 Überschreiben von Eigenschaften und Methoden der Superklasse | 181 |
3.8.2 Zugriff auf Eigenschaften und Methoden der Superklasse | 182 |
3.9 Optionals | 183 |
3.9.1 Deklaration von Optionals | 183 |
3.9.2 Zugriff auf Optionals | 184 |
3.10 Initialisierung | 187 |
3.10.1 Schreiben von Initializern | 188 |
3.10.2 Designated und Convenience Initializer | 193 |
3.10.3 Initializer und Vererbung | 194 |
3.10.4 Deinitialisierung | 196 |
3.11 Type Casting | 197 |
3.11.1 Typ prüfen | 197 |
3.11.2 Downcasting | 199 |
3.12 Enumerations | 201 |
3.12.1 Zusätzliche Werte in Membern einer Enumeration speichern | 202 |
3.13 Structures | 204 |
3.14 Generics | 205 |
3.14.1 Generic Function | 207 |
3.14.2 Generic Type | 209 |
3.15 Error Handling Model | 211 |
3.16 Extensions | 214 |
3.17 Protocols | 215 |
3.17.1 Protocol Type | 216 |
3.18 Access Control | 218 |
4 Grundlagen der iOS-Entwicklung | 220 |
4.1 Foundation-Framework | 220 |
4.1.1 Die wichtigsten Klassen aus dem Foundation-Framework und ihre Funktionen | 221 |
4.2 UIKit-Framework | 226 |
4.3 Speicherverwaltung | 226 |
4.4 Besonderheiten von Objective-C | 230 |
4.4.1 Kurzschreibweisen zum Erstellen von Objekten | 230 |
4.4.2 Vergleichen der Werte von verschiedenen Objekten | 233 |
4.4.3 Schlüsselwörter zum Zusammenspiel mit Optionals | 234 |
4.5 Besonderheiten von Swift | 235 |
4.5.1 Zusammenspiel zwischen Fundamental Types und Foundation-Framework-Klassen | 235 |
4.5.2 Playgrounds im Detail | 235 |
4.6 ObjectiveC und Swift vereint | 239 |
4.6.1 ObjectiveC-Code in Swift verwenden | 240 |
4.6.2 Swift-Code in Objective-C verwenden | 241 |
4.7 NSError | 241 |
4.7.1 Eigene Methode mit NSError-Parameter erstellen | 243 |
4.8 Dokumentation | 244 |
4.8.1 Besonderheiten bei Methoden | 245 |
4.8.2 Doxygen-Dokumentation in Xcode | 247 |
4.9 Nebenläufigkeit mit Grand Central Dispatch | 248 |
4.9.1 Parallel laufenden Code erstellen | 249 |
4.10 Grundlegende Struktur einer App | 251 |
4.10.1 main.m | 251 |
4.10.2 Info.plist | 252 |
4.10.3 App Delegate | 252 |
4.11 Lebenszyklus einer iOS-App | 253 |
4.11.1 Start einer App | 253 |
4.11.2 Lebenszyklus einer App | 254 |
4.11.3 Die Methoden des App Delegate | 255 |
4.11.4 Start der App | 256 |
4.12 Tipps für die tägliche Arbeit | 258 |
4.12.1 Die netten Kleinigkeiten .?.?. | 258 |
4.12.2 Fast Enumeration in ObjectiveC | 259 |
4.12.3 Type Casting in ObjectiveC | 259 |
4.12.4 Xcode-Beispielprojekte | 260 |
5 Die Entwicklungsumgebung – Xcode | 262 |
5.1 Willkommen bei Xcode! | 262 |
5.1.1 Was ist Xcode? | 263 |
5.1.2 Interface Builder und Xcode – endlich vereint! | 263 |
5.2 Arbeiten mit Xcode | 264 |
5.2.1 Dateien und Formate eines Xcode-Projekts | 264 |
5.2.2 Umgang mit Dateien und Ordnern in Xcode | 269 |
5.3 Der Aufbau von Xcode | 272 |
5.3.1 Die Toolbar | 272 |
5.3.2 Die Navigation Area | 274 |
5.3.3 Die Editor Area | 277 |
5.3.4 Die Utilities Area | 279 |
5.3.5 Die Debug Area | 280 |
5.4 Einstellungen in Xcode | 281 |
5.4.1 Anpassen von Xcode | 281 |
5.4.2 General | 281 |
5.4.3 Accounts | 282 |
5.4.4 Behaviors | 283 |
5.4.5 Navigation | 283 |
5.4.6 Fonts & Colors | 284 |
5.4.7 Text Editing | 285 |
5.4.8 Key Bindings | 285 |
5.4.9 Source Control | 286 |
5.4.10 Components | 287 |
5.4.11 Locations | 287 |
5.5 Projekteinstellungen | 288 |
5.5.1 Grundlagen | 288 |
5.5.2 Einstellungen am Projekt | 290 |
5.5.3 Einstellungen am Target | 293 |
5.5.4 Einstellungen am Scheme | 299 |
5.6 Grafiken und Asset-Bundles | 302 |
5.7 Lokalisierung mit Localizable.strings | 304 |
5.7.1 Grundlagen | 304 |
5.7.2 NSLocalizedString | 304 |
5.7.3 Erstellen der Localizable.strings-Datei | 305 |
5.7.4 Localized String mit Parameter | 307 |
5.7.5 Alle Localized Strings automatisch auslesen | 308 |
5.8 Der iOS-Simulator | 309 |
5.8.1 Grundlagen | 309 |
5.8.2 Funktionen und Möglichkeiten des Simulators | 309 |
5.8.3 Performance und Einschränkungen des Simulators | 313 |
5.9 Dokumentation | 313 |
5.9.1 Nichts geht über die Dokumentation! | 313 |
5.9.2 Das Documentation-Window | 316 |
5.9.3 Direktes Aufrufen der Dokumentation aus Xcode heraus | 319 |
5.10 Devices | 320 |
5.11 Organizer | 322 |
5.12 Debugging in Xcode | 325 |
5.12.1 Was ist Debugging? | 325 |
5.12.2 Die Debug Area | 325 |
5.12.3 Die Arbeit mit dem Debugger – NSLog und Breakpoints | 326 |
5.12.4 Debug Navigator | 335 |
5.13 Refactoring | 336 |
5.13.1 Grundlagen | 336 |
5.13.2 Refactoring-Funktionen in Xcode | 337 |
5.14 Instruments | 340 |
5.14.1 Über Instruments | 340 |
5.14.2 Nächste Schritte | 343 |
5.15 Tipps für die tägliche Arbeit | 343 |
5.15.1 Man lernt immer was dazu! | 343 |
5.15.2 Code Snippets | 344 |
5.15.3 Open Quickly | 345 |
5.15.4 Caller einer Methode feststellen | 346 |
5.15.5 Speicherorte für Ordner und Dateien ändern | 347 |
5.15.6 Shortcuts für die Navigation Area | 347 |
5.15.7 Run Without Building | 348 |
5.15.8 Clean Build | 349 |
6 MVC – Model-View-Controller | 350 |
6.1 MVC .?.?. was? | 350 |
6.2 MVC in der Praxis | 352 |
6.3 Kommunikation zwischen Model und Controller | 352 |
6.3.1 Key-Value-Observing | 353 |
6.3.2 Notifications | 359 |
6.4 Kommunikation zwischen View und Controller | 362 |
6.4.1 Target-Action | 362 |
6.4.2 Delegation | 364 |
7 Die Vielfalt der (View-)Controller | 366 |
7.1 Alles beginnt mit einem View-Controller .?.?. | 366 |
7.2 UIViewController – die Mutter aller View-Controller | 368 |
7.2.1 Wichtige Methoden von UIViewController | 370 |
7.2.2 UIView – fester Bestandteil eines jeden UIViewControllers | 372 |
7.3 View-Controller-Hierarchien | 373 |
7.4 View-Controller erstellen mit dem Interface Builder | 375 |
7.4.1 View-Controller mit NIB-File | 376 |
7.5 Storyboards | 406 |
7.5.1 Über Storyboards | 406 |
7.5.2 Das Storyboard-Projekt | 407 |
7.5.3 Die Klasse UIStoryboard | 417 |
7.5.4 Segues | 419 |
7.5.5 Zugriff über den App Delegate | 422 |
7.5.6 Quo vadis – Storyboard oder NIB-File? | 423 |
7.6 Auto Layout | 424 |
7.6.1 Setzen und Konfigurieren von Constraints | 424 |
7.6.2 Constraints bearbeiten und weiter anpassen | 426 |
7.6.3 „Optimale“ Constraints automatisch setzen lassen | 428 |
7.7 UIViewController und seine Subklassen | 429 |
7.7.1 UINavigationController | 430 |
7.7.2 UITabBarController | 436 |
7.7.3 UITableViewController | 440 |
7.7.4 UICollectionViewController | 447 |
7.7.5 UISplitViewController | 448 |
8 Views erstellen und gestalten | 452 |
8.1 Über Views in iOS | 452 |
8.2 UIView – die Mutter aller Views | 452 |
8.3 Arbeiten mit UIView | 453 |
8.3.1 Programmatisches Erstellen einer UIView | 453 |
8.3.2 View-Hierarchien | 455 |
8.3.3 Weiterführendes zu UIView | 459 |
8.4 Views erstellen mit dem Interface Builder | 460 |
8.4.1 Grundlagen | 460 |
8.4.2 View-Klasse mit NIB-File erstellen | 461 |
8.4.3 Beliebiges NIB-File laden und verwenden | 465 |
8.4.4 NIB-File nachträglich erstellen | 466 |
8.4.5 Unterschiedliche NIB-Files für iPhone und iPad erstellen | 468 |
8.5 Die wichtigsten Views und ihre Funktionen | 470 |
8.5.1 Grundlagen | 470 |
8.5.2 UILabel | 470 |
8.5.3 UIButton | 470 |
8.5.4 UISwitch | 471 |
8.5.5 UISegmentedControl | 471 |
8.5.6 UITextField | 471 |
8.5.7 UIImageView | 472 |
8.5.8 UIPickerView | 472 |
8.5.9 UIDatePicker | 473 |
8.5.10 UIWebView | 473 |
8.5.11 UIMapView | 474 |
8.5.12 UIScrollView | 474 |
8.5.13 UITextView | 475 |
8.5.14 UITableView | 476 |
8.5.15 UICollectionView | 476 |
8.5.16 Wichtig und unerlässlich: die Dokumentation! | 476 |
8.5.17 Views und der Interface Builder | 477 |
8.6 Die Grundlage gut gestalteter Views | 477 |
9 Das Model und die Datenhaltung | 480 |
9.1 Die Logik Ihrer App | 480 |
9.2 Benutzereinstellungen sichern und nutzen | 481 |
9.2.1 Über UserDefaults | 481 |
9.2.2 Standardeinstellungen festlegen | 484 |
9.3 Zugriff auf das Dateisystem | 484 |
9.3.1 Das Dateisystem von iOS | 484 |
9.3.2 FileManager | 486 |
9.3.3 File-Sharing-Funktion nutzen | 493 |
9.4 Core Data | 494 |
9.4.1 Datenbankverwaltung mit Core Data | 494 |
9.4.2 Wie funktioniert Core Data? | 495 |
9.4.3 Die Klassen und Bestandteile von Core Data | 496 |
9.4.4 Aufbau eines Standard-Core Data Stacks | 497 |
9.4.5 Der Core Data-Editor | 500 |
9.4.6 Erstellen eines neuen Managed-Objects | 508 |
9.4.7 Löschen eines Managed-Objects | 509 |
9.4.8 Laden von Managed-Objects | 509 |
9.4.9 Was kommt als Nächstes? | 511 |
10 Local und Push Notifications | 512 |
10.1 Was sind Notifications? | 512 |
10.2 Registrieren von Notification Types | 514 |
10.3 Registrieren von Notification Categories und Actions | 518 |
10.3.1 Erstellen einer Action | 518 |
10.3.2 Erstellen einer Kategorie | 520 |
10.3.3 Registrieren von Kategorien | 522 |
10.3.4 Reagieren auf eine Action | 523 |
10.4 Local Notifications | 525 |
10.4.1 Konfiguration des Alerts | 525 |
10.4.2 Konfiguration des Sounds | 527 |
10.4.3 Konfiguration des Badge Values | 528 |
10.4.4 Konfiguration von Audio, Bildern und Videos | 528 |
10.4.5 Speichern zusätzlicher Informationen in einer Local Notification | 530 |
10.4.6 Festlegen des Ausführungsereignisses | 531 |
10.4.7 Erstellen von Notification Requests | 535 |
10.4.8 Registrieren von Local Notifications im System | 536 |
10.4.9 Abbrechen bereits registrierter Local Notifications | 537 |
10.4.10 Reagieren auf den Erhalt einer Notification bei aktiver App | 537 |
10.5 Push Notifications | 539 |
10.5.1 Versand von Push Notifications | 540 |
10.5.2 Erstellen einer Push Notification | 544 |
10.5.3 Quality of Service | 547 |
11 Extensions | 548 |
11.1 Verfügbare Typen von Extensions | 548 |
11.2 Erstellen von Extensions in Xcode | 551 |
11.3 Funktionsweise einer Extension | 554 |
11.4 Wichtige Klassen und Objekte | 555 |
11.5 Unterstützte Dateitypen für Share- und Action-Extensions festlegen | 556 |
11.6 Action Extension | 557 |
11.6.1 Action mit User Interface | 557 |
11.6.2 Action ohne User Interface | 558 |
11.7 Content Blocker Extension | 559 |
11.7.1 Konfiguration eines Content Blockers | 560 |
11.7.2 Aktualisieren eines Content Blockers | 563 |
11.7.3 Die Klasse ContentBlockerRequestHandler | 563 |
11.8 Custom Keyboard | 564 |
11.8.1 Erstellen eines Custom Keyboards | 564 |
11.8.2 Arbeit mit der Klasse UIInputViewController | 565 |
11.8.3 Bearbeiten und Setzen von Text | 567 |
11.8.4 Mehrsprachige Keyboards | 568 |
11.9 Document Provider | 568 |
11.9.1 Document Provider-Extension | 569 |
11.9.2 File Provider | 572 |
11.9.3 Document Provider aufrufen | 574 |
11.10 iMessage Extension | 576 |
11.10.1 Aufbau und Funktionsweise der iMessage Extension | 576 |
11.10.2 Entwicklung einer iMessage Extension | 580 |
11.11 Intents Extension | 591 |
11.11.1 Domains und Intents | 592 |
11.11.2 Bestandteile einer Intents Extension | 593 |
11.11.3 Funktionsweise einer Intents Extension | 594 |
11.11.4 Übersicht über verfügbare Intents | 603 |
11.11.5 Voraussetzungen zur Verwendung von Siri in einer Intents Extension | 605 |
11.11.6 Erweitern von Siris Vokabular | 608 |
11.11.7 Testen einer Intents Extension | 614 |
11.12 Intents UI Extension | 615 |
11.12.1 Vorbereitung der Intents UI Extension | 616 |
11.12.2 Konfiguration des View-Controllers | 617 |
11.12.3 Default-Layout bei Maps und Messaging deaktivieren | 619 |
11.13 Notification Content Extension | 619 |
11.13.1 UNNotificationContentExtension | 619 |
11.13.2 Konfiguration der Info.plist-Datei | 621 |
11.14 Notification Service Extension | 622 |
11.15 Photo Editing Extension | 623 |
11.15.1 Festlegen der unterstützten Typen zur Bearbeitung | 627 |
11.16 Share Extension | 628 |
11.17 Shared Links Extension | 629 |
11.17.1 Erstellen eines NSExtensionItem | 630 |
11.17.2 NSExtensionItem als Shared Link bereitstellen | 631 |
11.18 Sticker Pack Extension | 632 |
11.18.1 Erstellen einer Sticker Pack Extension | 633 |
11.18.2 Komplexere Sticker Pack Extensions erstellen | 637 |
11.19 Today Extension | 639 |
11.19.1 Today Extension testen | 641 |
11.20 Watch App | 642 |
11.21 App Groups | 642 |
11.21.1 Registrieren einer App Group im Apple Developer Portal | 643 |
11.21.2 Registrieren einer App Group innerhalb einer App | 644 |
11.21.3 Zugriff auf eine App Group | 645 |
12 App-Entwicklung für die Apple Watch | 648 |
12.1 Apples neues großes Ding: Die Apple Watch | 648 |
12.2 Möglichkeiten, Einschränkungen, Unterschiede | 649 |
12.3 Das WatchKit SDK | 651 |
12.3.1 WKInterfaceController | 652 |
12.3.2 WKInterfaceObject | 652 |
12.3.3 WKExtensionDelegate | 653 |
12.3.4 Weitere Klassen | 653 |
12.4 Aufbau und Funktionsweise von Apple Watch-Apps | 654 |
12.4.1 iPhone-App | 654 |
12.4.2 WatchKit Extension | 654 |
12.4.3 WatchKit App | 655 |
12.4.4 Verbindung von WatchKit Extension und WatchKit App | 655 |
12.4.5 Notification Scene | 655 |
12.4.6 Complications | 656 |
12.5 Erstellen einer WatchKit App mitsamt WatchKit Extension | 656 |
12.5.1 Dateien der WatchKit Extension | 659 |
12.5.2 Dateien der WatchKit App | 660 |
12.5.3 Ausführen und Testen der Apple Watch-App | 661 |
12.6 Lebenszyklus einer WatchKit App | 662 |
12.7 Der WKInterfaceController im Detail | 664 |
12.7.1 Initialisierung | 664 |
12.7.2 Activation Events | 666 |
12.7.3 Setzen des Titels | 666 |
12.7.4 Ein- und Ausblenden von Interface-Controllern | 667 |
12.7.5 Umsetzen eines Navigation Stacks | 669 |
12.7.6 Reaktion auf Storyboard-Events | 670 |
12.7.7 Weitere Attribute | 671 |
12.7.8 Weitere Funktionen von WKInterfaceController | 672 |
12.8 Arbeiten mit dem Interface-Storyboard einer WatchKit App | 672 |
12.8.1 Erstellen und Konfigurieren eines WKInterfaceController | 673 |
12.8.2 Hinzufügen und Konfigurieren von Interface-Elementen | 675 |
12.8.3 Positionierung und Anordnung von Interface-Elementen | 676 |
12.8.4 Ändern der Größe von Interface-Elementen | 676 |
12.8.5 Unterschiedliche Konfigurationen für verschiedene Apple Watch-Größen | 678 |
12.8.6 Gruppierung von Interface-Elementen mittels WKInterfaceGroup | 680 |
12.8.7 Verbindung von Storyboard und Code | 682 |
12.8.8 Zusammenfassen mehrerer Interface-Controller zu einem page-based Interface | 686 |
12.8.9 Erstellen und Konfigurieren von Segues | 686 |
12.9 Erstellen von Tabellen | 689 |
12.9.1 Hinzufügen einer Tabelle im Storyboard | 689 |
12.9.2 Konfiguration einer Zelle | 690 |
12.9.3 Konfiguration einer Tabelle | 694 |
12.9.4 Verwenden verschiedener Zellen in einer Tabelle | 696 |
12.9.5 Zellen hinzufügen und entfernen | 699 |
12.9.6 Direkt zu einer bestimmten Zelle scrollen | 700 |
12.9.7 Aktuelle Anzahl an Zellen auslesen | 700 |
12.9.8 Auf die Auswahl einer Zelle reagieren | 701 |
12.9.9 Segues von Zellen einer Tabelle über das Storyboard konfigurieren | 702 |
12.10 Erstellen von Menüs | 703 |
12.10.1 Erstellen eines Menüs im Storyboard | 704 |
12.10.2 Erstellen eines Menüs im Code | 708 |
12.10.3 Fazit: Menüerstellung im Storyboard oder im Code? | 710 |
12.10.4 Mischen von Menüpunkten aus Storyboard und Code | 711 |
12.11 Eingabe von Text | 711 |
12.12 Notification Scene | 713 |
12.12.1 Short-Look und Long-Look Interface | 714 |
12.12.2 Long-Look Interface im Detail | 715 |
12.12.3 Erstellen eigener Notification Scenes | 716 |
12.12.4 Testen einer Notification Scene | 724 |
12.13 Complications | 724 |
12.13.1 Was sind Complications? | 725 |
12.13.2 Das ClockKit Framework | 725 |
12.13.3 Aufbau und Bestandteile von Complications | 725 |
12.13.4 Vorbereiten des eigenen Projekts | 729 |
12.13.5 Entwicklung einer Complication | 731 |
12.13.6 Bereitstellen der Complication mittels CLKComplicationDataSource | 736 |
12.14 Kommunikation und Datenaustausch zwischen iOS und watchOS | 739 |
12.14.1 Watch Connectivity | 740 |
12.15 Was sonst noch zu sagen und zu beachten ist | 745 |
13 Tests | 748 |
13.1 Unit-Tests | 748 |
13.1.1 Aufbau und Funktionsweise von Unit-Tests | 753 |
13.1.2 Aufbau einer Test-Case-Klasse | 755 |
13.1.3 Neue Test-Case-Klasse erstellen | 757 |
13.1.4 Ausführen von Unit-Tests | 759 |
13.1.5 Was sollte ich eigentlich testen? | 761 |
13.2 Performance-Tests | 761 |
13.3 UI-Tests | 763 |
13.3.1 Klassen für UI-Tests | 764 |
13.3.2 Aufbau von UI-Test-Klassen | 767 |
13.3.3 Automatisches Erstellen von UI-Tests | 767 |
13.3.4 Einsatz von UI-Tests | 768 |
13.4 Test-Driven Development | 768 |
14 Versionierung | 770 |
14.1 Über Versionskontrolle | 770 |
14.2 Basisfunktionen und -begriffe von Git | 771 |
14.2.1 Begriffe | 771 |
14.2.2 Funktionen | 771 |
14.3 Source Control in Xcode | 773 |
14.4 Version Editor und Source Control | 777 |
15 Veröffentlichung im App Store | 780 |
15.1 Zertifikate, Provisioning Profiles und Ihre App | 780 |
15.1.1 Certificates, IDs & Profiles | 782 |
15.1.2 Erstellen von?.?.?. | 784 |
15.2 Testen auf dem eigenen Endgerät | 797 |
15.2.1 Setzen des Teams | 797 |
15.2.2 Auswahl Ihres iOS-Geräts | 797 |
15.3 iTunes Connect und Veröffentlichung im App Store | 799 |
15.3.1 Vorbereiten der App in iTunes Connect | 801 |
15.3.2 Upload der App in den App Store | 804 |
15.3.3 Wie geht es weiter? | 805 |
Index | 806 |