Home
Apps programmieren für iPhone und iPad - beck
Contents
1. Abbildung 3 17 Ziehen einer Outlet Verbindung Nachdem Sie die Maustaste innerhalb der Klassendeklaration losgelassen haben erscheint der in Abbildung 3 18 abgebildete Pop over Dialog ber den Sie ein Outlet oder eine Outlet Collection anlegen k nnen Geben Sie clockViewin das Textfeld ein und lassen Sie die brigen Einstellungen des Dialogs unver ndert Durch einen Klick auf den Button CONNECT erstellen Sie im Quelltext ein Attribut und eine Property vor deren Klasse die Markierung IBOutlet steht Diese Markierung ist ein leeres C Makro das keine Auswirkung auf den erzeugten Programmcode hat 228 3 2 Views und Viewcontroller Es dient lediglich dazu dem Interface Builder anzuzeigen dass er zu dieser Property Verbindungen herstellen kann property nonatomic retain IBOutlet ClockView clockView Breakpoints l J Editor ES AlarmClock C AlarmClock gt Alarm gt ill E Automatic B AlarmClockViewController h gt No Selection import lt UIKit UIKit h gt Connection Outlet Object File s Owner 4 Name clockView interface AlarmClockViewController UIViewController B X f end Type ClockView mo Connect Abbildung 3 18 Pop over Dialog f r das Outlet Der Speicherverwaltungstyp der Property h ngt davon ab welches Speicherverwal tungsmodell Ihr Projekt verwendet Bei manuellem Referenzenz hlen hat die Pro perty
2. SCTOINTOR GCs ege 579 SCHON VIG Weisessssesssscscnccsssadsssszcusscessitasnccsunbevasatessecenonees 611 scroll ViewDidEndDragging eeo 776 scrollViewDidScroll ueee 776 975 AAA ER 975 searchDisplayController shouldReload TableForSearchString s es 494 SECTION a re master 473 Secure by Default 698 Secure Coding Guide 656 Security Advisor 981 Security Elte ease 977 Security Response 988 Security DatenbanK ee 981 Security Expertise a SOcUrity Testing nass Securtt Trainimg EE Segmented Control 353 EE 227 259 Selected re 242 Selektor teen 69 Sellin 70 82 207 sendAsynchronousRequest queue completionHandler eeeee 834 Se E 990 sendSynchronousRequest returning RESPONSE goe ECG 823 setBackgroundImage forBarMetrics 347 setBackgroundImage forToolbarPosition barMetties use 347 setCenterCoordinate animated 871 SetD teForm t a 83 setFinishedSelectedImage withFinished UnselectedImage eee 381 GR ERR 826 Set TD Method devin 826 setNeedsDisplay een 209 358 584 SOUT Ee 83 setTranslatesAutoresizingMasklInto Constraints enan aane 427 setValue forHTTPHeaderField setValue forKey wees apa setViewControllers direction animated completion nyaaa an 384 setVisibleRect animated 873 sharedApplication shouldAutomaticallyForward AppearanceMetbods EE 390 shouldAutomaticallyForward RotationMethods shouldAut
3. didReceiveMemoryWarning Ladezyklus dealloc lt q _ Abbildung 3 34 Der Lebenszyklus eines Viewcontrollers 263 3 Views und Viewcontroller SSS eee Richtig berschreiben Sie d rfen alle Methoden aus Abbildung 3 34 berschreiben Dabei sollten Sie jedoch in der Methode bis auf view setView und loadView auch immer die Methode in der Oberklasse aufrufen Bei den drei genannten Methoden k nnen Sie die Methode der Oberklasse aufrufen m ssen es jedoch nicht tun Bei initialisierenden Methoden wie awakeFromNib oder viewDidAppear sollte der Aufruf immer am Anfang der Methode erfolgen Bei den finalisierenden Methoden wie viewWillDisappear oder viewDidUnload erfolgt der Aufruf der Supermethode hingegen erst am Schluss der berschreibenden Methode F r die Methoden view DidAppear und viewWillDisappear sieht das beispielsweise so aus void viewDidAppear BOOL inAnimated super viewDidAppear inAnimated Hier steht Ihr Code void viewwillDisappear BOOL inAnimated Hier steht Ihr Code super viewWillDisappear inAnimated Seit iOS 6 hat Apple die Methoden viewwWillUnload und viewDidUnload als veraltet markiert Sie d rfen sie zwar weiterhin verwenden allerdings kann Apple die Unter st tzung daf r mit einer zuk nftigen iOS Version ganz einstellen Abschnitt 3 2 11 Speicher und Ressourcenverwaltung des Viewcontrollers geht noch genau
4. IScrollViewDelegate ISearchBar ISearchBarDelegate ISearchDisplayController ISegmentedControl Idee eege in nase ISplitViewController IStepper IStoryboard IStoryboardSegue ISwipeGestureRecognizer 1 1 ITabBarControllerDelegate ITabBarDelegate ITabBarltem ITableView ITableViewCell ITableViewController ITableViewDataSource ITableViewDelegate ITapGestureRecognizer ITextField TTEXtVIeW En IToolBar IToolbar 1 IUserInterfaceldiomPad IUserInterfaceldiomPhone IViewAnimationOptionAllow AnimatedContent UIViewController 381 381 381 615 Hp 309 391 392 Umgebender View 206 Umgebung 978 U U U u U Ungeordnete Menge 187 Unicode ie Aere 767 teen KE 548 ausf hren 551 Universelle App 313 Unterklasse sans nasser 61 Unver nderliche Objekte 174 Unwind bergang ssssss11s1151111s1111risrinrtaneene 339 Upper Camel Case 71 OR Disarray sarees EE 790 URL Anfrage 22 Nat 774 Anfrage Synchrone us 774 K diefung e ugs 782 Protokoll useCredential forAuthentica tionChallenge esu 846 U sersAgent ciansusek n sein 825 Userdefaults 357 376 userlInteractionEnabled 246 618 userlnterf celdiom 291 313 Utilities Ansicht a anne 34 Une Me e 887 V V luekorkeg oreesa iai 159 187 574 valueForKeyPath eeee 377 773
5. State Config Default D Title ein Image Default Image v Background Default Background Image v Font System Bold 15 0 DIE Text Color Wm Default Shadow Color ES Default Shadow Offset aal aal C Reverses On Highlight Highlight Tint Default D Drawing 1 1 Shows Touch On Highlight m Highlighted Adjusts Image RA Disabled Adiusts Imane Content Line Bre Title d Image insel OY op Bottom ols ai Left Right Abbildung 3 26 Der Attributinspektor eines Buttons Durch die M glichkeit f r die verschiedenen Buttonzust nde unterschiedliche Dar stellungen festzulegen k nnen Sie Ihren Apps relativ einfach optisch ansprechende Buttons hinzuf gen und damit auch fehlende Buttontypen beispielsweise Checkbo xen basteln so l sst sich die Uhr auch ber einen einrastenden Button anstatt eines Schalters steuern Das Einrasten erreichen Sie durch die Invertierung des Zustands selected Die Actionmethode switchAnimation in der Datei AlarmClockViewCon troller m m ssen Sie dazu wie folgt ndern IBAction switchAnimation UIButton inSender inSender selected inSender selected if inSender selected self clockView startAnimation else self clockView stopAnimation Listing 3 25 Actionmethode f r einen einrastenden Button Nat rlich m ssen Sie auch die Deklaration der Methode in der Headerdatei ent
6. Doppel Tap erkannt Listing 3 24 Erkennung einer Double Tap Geste In den Body der if Abfrage k nnen Sie den Code einsetzen den Sie bei einem Dop peltap ausf hren wollen Die Zahl in der Bedingung gibt die notwendige Anzahl der Taps an Wenn Sie sie entsprechend anpassen k nnen Sie mit dem Code auch Drei fach oder Vierfachtaps erkennen Jede Geste sendet mindestens zwei Ereignisse UIControlEventTouchDown und einen Touch Up Event Sie k nnen bei Gesten f r Fingerbewegungen UIControlEvent TouchDown zur Initialisierung der Geste und UIControlEventTouchUpInside oder Out side zum Beenden verwenden Gegebenenfalls sollten Sie auch das Ereignis UIControlEventTouchCancel auswerten ber dieses Ereignis k nnen Sie nderungen bei einem Gestenabbruch r ckg ngig machen Die Gestenverarbeitung f r Ereignisse l sst sich jedoch nur sehr schlecht wiederver wenden Das ist gerade bei komplexen Gesten ung nstig F r die Gestenverarbei tung gibt es noch andere M glichkeiten siehe Abschnitt 3 2 8 Ereignisse f r Text nderungen Diese Ereignisse unterst tzt derzeit nur die Klasse UITextField die ein Feld f r die Eingabe eines einzeiligen Textes darstellt Sie k nnen zwar auch hier Actionmetho den mit UIEvent Parametern verwenden F r diesen Parameter bekommen Sie aller dings immer nil bergeben gt UIControlEventEditingDidBegin markiert den Beginn der Eingabe in das Textfeld gt UIControlEventEditingDidChange zeig
7. seseeeeeeseseseseseresesseseseseseresessrsrsrseseisesesererssstersreeseresesers Z sammenfass ng niian a a a ae 197 Views und Viewcontroller 199 Eigene View Klassen in Cocoa Touch ENNEN 199 3 1 1 Zeichnen in Cocoa Touch BAD Zeitberechnung ierann E A E T REN 3 1 3 View Erzeugung Uber NlB Datelen ENEE 220 3 1 4 Aktualisierung der Zeitanzeige EEN 222 3 15 Wiederverwendbarkeit VON VieWS anescesssenesennennennnnenennnnnnnennnnennenennnnennennne 225 Views und Viewcontroller eseeeoeeeeeseseeseseseseseseserererssseseseseseressssrsesrseseresserees 226 3 2 1 Outletsau esse 3 2 2 Outlet Collections 3 3 3 4 3 5 4 1 4 2 3 2 3 Cont lnerviewWs edd ee 233 3 2 4 Viewhieratchien 4 ee 234 3 2 5 leede 235 3 2 6 Ereignisse a iii alien adds 238 237 Controlzust nde und Buttons ENEE 242 3 2 8 Direkte Gestenverarbeitung ENEE 246 329 TEE BEE 259 3 2 10 Der Lebenszyklus eines Viewcontrollers E 261 3 2 11 Speicher und Ressourcenverwaltung des Viewcontrollers 266 Lokale Benachrichtigungen 268 3 3 1 Benachrichtigungen versenden EE 270 3 3 2 Benachrichtigungen verarbeiten NEE 273 Eine App f r alle Seel 278 3 4 1 Das LEE KD EU 280 3 4 2 Sprachkursus f r die App 282 34 3 Esfunktioniertnicht u innen 286 3 4 4 Launch Images und iPHONE bn 287 3 4 5 Universelle Apps EEN NEEN 290 Fehlersuche ara nee 292 3 51 Jegen EE 293 35 2 Der Debugger eegne EES 294 3 5 3 Die
8. Index Index animateWithDuration animations completion eh h acetates esededeatens 559 animateWithDuration delay options animations completion eeee 563 animation animations Animierbare Property 560 Anmerkungen auf einer Karte 875 ANNOTALIONS se nn 876 Anonyme Kategorie 116 155 222 ANSTC zen ae em gehe 65 heet Ee 622 AMICI EE 169 ANYVODIJOCE tes Sana 188 Anzeigeausrichtumng E 416 App lokalisieren u sssen eeisesaen 282 App Store appearance appearanceWhenContainedIn u 400 appendbormat EE 180 AppPeENdSTINE aset ees 181 DEEL ege ee 278 SAPP sD a Rem 29 51 Apple Developer Network ss 22 Apple Push Notification application didFinishLaunching WithOptions 128 261 290 312 317 application didReceiveLocal Notification oc 273 408 942 application supportedInterface OrientationsForWindoW eee 368 application Become Active 129 Application Delegate 126 225 379 applicationDidEnterBackground 129 applicationDidReceiveMemory Warning ae 130 131 278 Application Singleton ou 322 applicationState as enensensseens 274 applicationWillTerminate s ssseissesissssissseeee 129 AQUA OR kaan ieena n 871 RE eieiei 32 135 162 AAT CHW ee 913 Archivverwaltung s sssssssseisssersserrssseresserrsseerrese 913 ARENS 916 Ree 916 EU 149 Array und Zahlen 183 arrayWithContentsOffFile u 793 arrayWithCon
9. self clockView stopAnimation d Listing 3 22 Actionmethode zum Starten und Stoppen der Animation 237 3 Views und Viewcontroller Au erdem sollte die Methode viewWillDisappear die Uhr stoppen Wenn Sie nun das Projekt ausf hren k nnen Sie die Uhr ber den Schalter starten und stoppen Allerdings steht nach dem Starten die Uhr obwohl der Schalter auf ein steht Sie k nnen das umgehen indem Sie entweder die Uhr in viewDidAppear starten oderim Attributinspektor des Schalters dessen Anfangszustand auf aus ndern Eine weitere Alternative besteht darin auch f r den Schalter ein Outlet anzulegen Die Methode viewDidAppear kann dann den Wert des Schalters auslesen und in Abh ngigkeit davon die Uhr starten Der Vorteil dieser L sung ist dass Sie den Anfangszustand der Uhr ber den Interface Builder also ohne Ver nderung des Pro grammcodes einstellen k nnen Au erdem beh lt die Uhr ihren Animationszu stand bei wenn die App zwischenzeitlich einen anderen Viewcontroller anzeigt Das ist bei diesem kleinen Projekt mit einem Viewcontroller vielleicht kein so gro er Vor teil kann allerdings bei sehr umfangreichen und komplexen Applikationen sehr angenehm sein Wenn Sie die entsprechende Outlet Property animationSwitch nen nen sieht der Code daf r so aus void viewDidAppear BOOL inAnimated super viewDidAppear inAnimated if self animationSwitch on clockView startAnimation Listing 3
10. E ios Application l 2 7 Framework amp Library X sl Master Detail OpenGL Game Page Based a Mac OS X Application Application z Application S 4 e z Framework amp Library 1 x Application Plug in aa le i System Plug in 29 Tabbed Application Utility Application Empty Application in Single View Application This template provides a starting point for an application that uses a single view It provides a view controller to manage the view and a storyboard or nib file that contains the view eos Ser Abbildung 3 1 Auswahl der Projektvorlage f r den Wecker Choose options for your new project Product Name AlarmClock Organization Name Clemens Wagner Company Identifier de ifoo Bundle Identifier de ifoo AlarmClock Class Prefix AlarmClock Devices Use Storyboards Use Automatic Reference Counting C Include Unit Tests Abbildung 3 2 Die Parameter f r das neue Projekt Als Erstes soll der Wecker ein Ziffernblatt erhalten Da es daf r keinen fertigen View in Cocoa Touch gibt m ssen Sie eine eigene Viewklasse erstellen Zum Anlegen der Klasse klicken Sie mit der rechten Maustaste auf die Gruppe ALARMCLOCK und w h len den Punkt NEw FILE aus siehe Abbildung 3 3 200 3 1 Eigene View Klassen in Cocoa Touch Show in Finder Open with External Editor New Group New Group from Selection Add Files to AlarmClock Delete Source Control
11. eeeen 546 Foundation ara 174 Foundation Pramework s 101 117 und Core Foundation 597 Fowler Martin einer Animation frames Framework Core Foundation anereneneen 781 CoreL cdtien a unn nannsnsensenen 873 Framework Forts SystemConfiguration TouchXML Fremdcode fromValue G Gamma Erich Gang ofFour Garbage Collection Garbage Collector Gebeimnieprinzip Gemeinsame Oberklasse Generic Passwords PENSITE a aa a aa geocodeAddressDictionary completion Handler Geocoder Geografische Koordinate Geokoordinaten Gerateausrichtung Ger teidentifizierung Ger teregistrierung Ger teverwaltung Gestenverarbeitung Gesture Recognizer GET Anfrage Getter git Kommandozeilenprogramm gitolite Gitter Globale Suche gl setup Gl heffekt Goldberg Adele Go Live Test Index Index H Hardware Tastatur 448 Hauptachsentransformation s src 611 Headerdatei u sek importieren Heap sagte FHEISEH Ne EECH Helm Richard esesee helps hidden ns highlishted n aueassseneneeneenanar SL iei pueiununiaa Hintergrundfarbe EE 210 hitTest withEvent eeene 246 Hochformat a ER 410 HTTP Rasen ati 863 HTTP Methode E 824 POST em 850 Hybriddarstellung ee 870 IBACHON RR 236 340 LBE nisse sen 228 IBOutletCollection e 232 le E WE 44 lge 278 IEONLIO nen 656 de sn 68 69 99
12. theAlert release self playSound Listing 3 47 Anzeige einer Alertbox beim Empfang einer Benachrichtigung Sie k nnen den Systemton f r lokale Benachrichtigungen leider nicht selbst in Ihrem Programm abspielen Es gibt daf r keine Funktion oder Methode die genau diesen Klang ert nen l sst Die Applikation soll stattdessen einen anderen Ton abspielen was in der Methode playSound geschieht Das Klingeln eines mechanischen Weckers passt hier sehr gut und Sie finden die Datei ringtone caf im Beispielprojekt auf der DVD Sie k nnen aber auch andere T ne verwenden wenn sie im passenden Format vorliegen Die T ne m ssen laut Dokumentation als 16 Bit Little Endian PCM Audiodaten im Core Audio Format mit der Endung caf vorliegen und die Lange des Tons darf nicht gr er als 30 Sekunden sein Unter OS X gibt es das Kommandozeilenprogramm afconvert mit dem Sie eine Audiodatei in dieses Format konvertieren k nnen Der Aufruf daf r ist usr bin afconvert f caff d LEI16 Eingabedatei Ausgabedatei 274 3 3 Lokale Benachrichtigungen Dabei ist der Parameter Eingabedatei die Datei mit dem Ton im Ursprungsformat und das Programm schreibt den konvertierten Klang in die Datei Ausgabedatei Liegt der Klingelton f r den analogen Wecker beispielsweise als WAV Datei vor k n nen Sie ihn mit usr bin afconvert f caff d LEI16 ringtone wav ringtone caf in eine CAF Datei konvertieren Bevor Sie den Klang ve
13. E ClockViewController xib gt Supporting Files gt Frameworks gt Products Abbildung 3 21 Umstellung auf Baumansicht Mauszeiger In der Baumdarstellung k nnen Sie sehen wie die Views verschachtelt sind und in welcher Reihenfolge sie innerhalb einer Ebene liegen Diese Anordnung wirkt sich auf die Darstellung und die Verarbeitung der Eingaben oder auch Touches aus Je n her ein View zum Hauptview liegt umso fr her stellt Cocoa Touch ihn dar Wenn also zwei Views einen gleichen Bereich auf dem Display verwenden dann verdeckt der sp ter dargestellte View den fr her dargestellten In Abbildung 3 22 ist die Baumdarstellung eines Views zu sehen Dabei haben die Views bis jeweils die gleichen Ziffern wie die Views in der Voransicht Der rote View amp ist am n chsten zum Hauptview weswegen ihn alle anderen Views verde cken Der gelbe View liegt hinter dem gr nen und verdeckt somit diesen und der schwarze View liegt im gelben View wodurch er diesen verdeckt 234 3 2 Views und Viewcontroller y Geb Ld Schwarz wei O Abbildung 3 22 Baumdarstellung eines Views nderung der Viewhierarchie Sie k nnen auch in der Baumdarstellung die Anordnung der Views ver ndern Zie hen Sie dazu die Views einfach an die gew nschte Position Wenn Sie dort einen View auf einen anderen ziehen f gt der Interface Builder den gezogenen View als letzten Subview des anderen Views ein Di
14. M PI 21600 0 CGContex CGContex 0 0 CGContex CGContex CGContex CGContex tSet tSet tAdd tSaveGState theContext tSetRGBStrokeColor theContext gt 0 0 1 0 self tracking 0 5 1 0 LineWidth theContext 7 0 LineCap theContext kCGLineCapRound tMoveToPoint theContext 2 theCenter x theCenter y LineToPoint theContext gt thePoint x thePoint y CGContex CGContex tStrokePath theContext tRest toreGState theContext Listing 3 33 Zeichnen des Alarmzeigers In der XIB Datei k nnen Sie jetzt das Control in den Clockview legen wenn Sie dem Control eine transparente Hintergrundfarbe geben Ziehen Sie dazu zuerst ein UIView Objekt aus der Bibliothek auf das Ziffernblatt und weisen Sie ihm die Klasse ClockControl ber dessen Identit tsinspektor zu Das Control sollte die gleiche Gr e wie der Clockview haben Au erdem m ssen Sie dessen Property userInteraction Enabled im Attributinspektor auf YES setzen damit Cocoa Touch die Gesten auch an das Control sendet 253 3 Views und Viewcontroller Um Ihr neues Control zu testen legen Sie ein Label in den View und verbinden es tiber ein Outlet mit dem Namen timeLabel mit dem Viewcontroller In diesem Label soll der Wecker die Alarmzeit als Text anzeigen Au erdem verbinden Sie das Control im Inter face Builder ber den Ereignistyp Value Changed mit der Methode updateTimeLabel des Viewcontrollers deren I
15. Sie konnen Ihre Viewcontroller und auch Objekte von beliebigen Klassen in NIB Dateien anlegen Dazu ziehen Sie das entsprechende Controllerobjekt siehe Abbil dung 3 31 einfach in die linke Seitenleiste des Interface Builders und verbinden es ber ein Outlet mit dem FILE s OWNER Wenn Sie Objekte mit anderen Klassen anle gen wollen verwenden Sie stattdessen den orangenen W rfel siehe Abbildung 3 33 Sie k nnen so Objekte mit nahezu beliebigen Klassen in der XIB Datei oder im Story board anlegen p Abbildung 3 33 Bibliothekssymbol f r beliebige Objekte Wenn Sie diese Objekte nach der Erzeugung initialisieren m chten sollte deren Klasse eine Initialisierungsmethode init oder initWithCoder besitzen wobei Cocoa Touch Letztere bevorzugt Alternativ k nnen Sie auch den Initialisierungscode in die Methode awakeFromNib schreiben siehe Abbildung 3 15 Zu beliebigen Objekten in NIB Dateien folgen sp ter noch Beispiele Tipp Wenn Sie einen einfachen Viewcontroller ber eine NIB Datei erzeugen sollten Sie unbedingt auf zwei Dinge achten Erstens m ssen Sie im Identit tsinspektor die Klasse des Viewcontrollers setzen Andernfalls erzeugt Ihre App f r den Viewcon troller ein Objekt mit der Klasse UIViewController Zweitens sollten Sie im Attribut inspektor des Controllers die richtige XIB Datei mit dem passenden View ausw hlen Auch bei beliebigen Objekten m ssen Sie deren Klasse im Identit tsinspektor set zen ansonste
16. e des Views so wie in Abbildung 3 7 darge stellt Er sollte eine quadratische Grundfl che von 320 x 320 Punkten haben und am 203 3 Views und Viewcontroller Koordinatenursprung 0 O liegen Der Ursprung eines Views ist immer die linke obere Ecke Die horizontale Ausdehnung w chst nach rechts und die vertikale nach unten A AlarmClockViewController xib Top Space to View Hr Trailing Space to View Hr r Leading Space to View Bottom Space to View Equals 140 000000 Abbildung 3 7 Der Gr eninspektor des Views mit Autolayout Das Ziffernblatt belegt mit dieser Einstellung nur circa zwei Drittel der oberen Flache des iPhone Bildschirms Sie k nnen das berpr fen indem Sie das Projekt ausf h ren Der Simulator zeigt jetzt eine wei e und darunter eine etwa halb so gro e graue Fl che an Arrange Position View r Abbildung 3 8 Der Gr eninspektor mit Autosizing 204 3 1 Eigene View Klassen in Cocoa Touch Uber das dritte Symbol von links neben dem Gr eninspektor oder mit cmd 3 w hlen Sie den Identit tsinspektor aus Legen Sie dort ber das oberste Eingabefeld CLAss die Klasse des Views fest Siek nnen den Klassennamen dort ent weder direkt eingeben oder aus einer Liste ausw hlen siehe Abbildung 3 9 Weisen Sie dem View die neu angelegte Klasse ClockView zu D
17. 3 H chster Wiederverwendungsgrad da die Gestenerken nung komplett von der Darstellung getrennt ist Tabelle 3 2 Vor und Nachteile verschiedener M glichkeiten zur Gestenerkennung 258 3 2 Views und Viewcontroller Der Hauptnachteil bei der Verwendung der Responder Methoden die enge Kopp lung des Views an den Viewcontroller kann nat rlich auch bei undurchdachter Im plementierung der anderen Verfahren auftreten Bei der Verwendung des Respon der Mechanismus tappen jedoch viele Programmierer in diese Falle Sie k nnen eine starke Koppelung jedoch wie beschrieben ber Delegation vermeiden 3 2 9 berg nge Mit iOS 5 und den Storyboards hat Apple auch Segues berg nge eingef hrt Diese Objekte beschreiben einen bergang von einem Viewcontroller zu einem anderen berg nge haben somit als Verbindungstyp im Interface Builder einen sehr einge schr nkten Anwendungsbereich Andererseits k nnen Sie dar ber schon im Inter face Builder eine Verkn pfung zwischen den UI Elementen und den Views festlegen Deswegen nennt Apple diese neuen Beschreibungsdateien f r die Views auch Story boards Um die Funktionsweise der berg nge zu veranschaulichen erstellen Sie ein kleines Projekt Legen Sie dazu in Xcode ein neues iPad Projekt des Typs SINGLE VIEW APPLI CATION an und geben Sie an dass dieses Projekt ein Storyboard und ARC verwenden soll ffnen Sie das Storyboard und legen Sie einen neuen Button in den dort ange z
18. 368 UllnterfaceOrientationlsPortrait 368 UlInterfaceOrientationLandscapeLeft 368 UlInterfaceOrientationLandscapeRight 368 UllnterfaceOrientationMaskAll 369 UllnterfaceOrientationPortrait e 368 UlInterfaceOrientationPortrait UpsideDown een 368 IKeyboardDidShowNotification 448 IKeyboardWillHideNotification 448 IKeyboardWillShowNotification 448 U U U U U U U UlLongPressGestureRecognizer uee 256 UlModalTransitionStyleCoverVertical 328 UlModalTransitionStyleCrossDissolve 328 UIModalTransitionStyleFlipHorizontal 328 UIModalTransitionStylePartialCurl 328 UlNavigationBar eeee 335 345 UINavigationController 415 UINavigation tem EE 336 U U U U U U TPageControl ve gz 239 IPageViewController eneee 381 IPageViewControllerDataSource IPageViewControllerDelegate 385 IPageViewControllerOptionSpine TocationKey teens 384 1010 IPageViewControllerSpineLocationMax IPageViewControllerSpineLocationMid IPageViewControllerSpineLocationMin IPageViewControllerTransition StylePageCurl UlPageViewControllerTransition StyleScroll PanGestureRecognizer PinchGestureRecognizer PopoverArrowDirectionAny DopoverController EE RefreshControl I I I I I IRequiredDeviceCapabilities I I RotationGestureRecognizet IScreen IScrollView
19. MIEProtokoll nn 132 identifien arena 260 Identit tsinspektor we 205 Elle Kette ed EIERE 805 Imagebdgelnsertg EEN 243 ImagelO Pramework EE 596 imageNamed u 280 627 Immut bles u n 2eeerieesii 174 Implementierung 984 ImplementierungsblocK EE 40 Implementierungsdatei nee 37 79 Implementierungsdetail 59 79 197 1000 Implementierungsfehler nn Implementierungsrichtlinie Importanweisung Inaktive Applikation Individual iOS Developer Program Info plist InfoPlist strings Information Disclosure Ingalls Dan In House Distribution neeeee HIT ee Rice ROR rer PONTO 70 83 85 206 262 Initialer Viewcontroller 308 351 379 Initialisierungsmethode initWithBytes length initWithCoder ee 220 262 480 initWithContentsOfFile encoding error 177 initWithContentsOfURL e 822 initWithContentsOfURL encoding CTO een 177 823 initWithContentsOfURL options error 822 initWithContentsOfURL used Encoding error 823 initWithData encoding ss 769 initWithFrame 205 206 220 480 513 initWithNibName bundle initWithString Input Accessory View INPUTACCESSOTY VIEW esssseseesssssseeecssssseeessssneeees insertRowsAtIndexPaths withRow Animation usesesseenesennen insertSections withRowAnimation Installationshandbuch Installationsprozess instanceAlphaOffset instanceCount instancesRespon
20. Project Navigator Help Abbildung 3 3 Hinzuf gen einer neuen Klasse Wahlen Sie in der linken Spalte den Punkt Cocoa TOUCH in der Rubrik 10S aus Auf der rechten Seite erscheint eine Liste mit Dateivorlagen aus der Sie OBJECTIVE C CLASS ausw hlen Geben Sie im n chsten Schritt der Klasse den Namen ClockView und w hlen Sie als Superklasse UIView aus siehe Abbildung 3 4 Xcode erstellt die Klassen dann als Subklasse von UIView Choose options for your new file Class ClockView NSObject UlTableViewCell Abbildung 3 4 Subklasse von UlView Subclass of Im letzten Schritt w hlen Sie den Ordner die Gruppe und das Target f r die Header und die Implementierungsdatei aus siehe Abbildung 3 5 Hier k nnen Sie einfach die Voreinstellungen bernehmen 201 3 Views und Viewcontroller Gruppen und Targets Dabei ist eine Gruppe ist jeweils eine Hierarchieebene in der Dateiansicht von Xcode Obwohl Gruppen ein gelbes Ordnersymbol als Icon haben entsprechen sie keinem Dateiordner auf der Festplatte Mit einem Xcode Projekt k nnen Sie unter schiedliche Produkte z B Programme erzeugen Wie Xcode dieses Produkt erstellt beschreibt dabei ein Target gt e ham E AlarmClock H a A clemens AlarmClock Info plist LO A Programme h AlarmClo Prefix pch Dienstprogramme 0 h AlarmClo elegate h F Dokumente m AlarmClo elegate m h AlarmClo ntroller h Down
21. 4 Asynchrone Kommunikation ENEE 8 4 5 Gro e Datenmengen der bertragung neesenneneneneenn 838 8 4 6 Passwortabfragen ENEE 84 7 Hier geht die POST ab BAB Datei pl ad u n 2 e isses iin 8 4 9 berpr fung der Erreichbarkeit nansseseesnnsnseneenneneenn 864 SiS Karten ies acti nn Ense 869 8 51 Karten darstelle openee NEESS 869 85 2 Koordinatensysteme aus aden diaries 871 8 5 3 Geokoordinaten bestimmen EE 873 8 5 4 Eigene Kartenbeschriftungen EE 875 ER e EE 878 9 Jahrmarkt der N tzlichkeiten 883 9 1 Die Struktur von Xcode A NENNEN 883 9 1 1 Das Hauptfenster und die Werkzeugleiste EE 884 9 1 2 Die Navigatorspalte Eeer 885 9 1 3 Der Utilitybereich u alas 887 GE D TEE 889 9 1 5 Autovervollst ndigung und Codeschnipsel EE 890 9 1 6 TastaturkurZzbetenle ieren 9 1 72 TabsiuAdFefister stecht ri nor 9 1 8 Liebling ich habe das SDK geschrumpft 9 1 9 Snapshots sa ma 12 9 2 9 3 9 4 9 5 9 6 Refactoring eseu eege EE 901 9 2 1 Refactorings in XCode nungen 901 9 2 2 Methoden auslagern 904 9 2 3 Oberklassen erzeugen und Methoden verschieben 906 9 2 4 Attribute kapseln und verschieben ssssssssssssssssssssessessssssreessessseesseessesssses 909 Der Organizer u si in BR BR 910 9 3 1 Die Ger teverwaltung ee EENS 910 9 3 2 gt Projektverwaltung Accent een 912 9 3 3 Archive und die Archivverwaltung En 913 9 3 4 Dokumentation niet 91
22. CGRectGetWidth self bounds 2 0 NSDateComponents theComponents 2 self calendar components NSHourCalendarUnit gt SMinuteCalendarUnit gt SSecondCalendarUnit gt fromDate self time CGFloat theSecond theComponents second M PI 30 0 CGFloat theMinute theComponents minute M PI 30 0 CGFloat theHour theComponents hour gt theComponents minute 60 0 M PI 6 0 CGPoint thePoint self pointWithRadius theRadius 0 7 gt angle theHour J CGContextSetRGBStrokeColor theContext gt 0 25 0 25 0 25 1 0 CGContextSetLineWidth theContext 7 0 CGContextSetLineCap theContext kCGLineCapButt CGContextMoveToPoint theContext theCenter x theCenter y CGContextAddLineToPoint theContext thePoint x thePoint y CGContextStrokePath theContext thePoint self pointWithRadius theRadius 0 9 gt angle theMinute CGContextSetLineWidth theContext 5 0 CGContextMoveToPoint theContext theCenter x theCenter y CGContextAddLineToPoint theContext thePoint x thePoint y CGContextStrokePath theContext thePoint self pointWithRadius theRadius 0 95 angle theSecond CGContextSetLineWidth theContext 3 0 CGContextSetRGBStrokeColor theContext 1 0 0 0 0 0 1 0 219 3 Views und Viewcontroller CGContextMoveToPoint theContext theCenter x theCenter y CGContextAddLineToPoint theContext thePoint x thePoint y CGContextStrokePath theCon
23. Debuggerkonsole 0 0 0 esssscessecesseeesecessnccesseceesecseseesereeeceneseeneeeesees 298 3 54 Llaufzeitfehler cnino iani a EAA iaia 304 Alles unter Kontrolle 307 Viewcontroller XIBs und Storvboard s EEN 307 4 1 1 Erstellung von Viewcontrollern ber XIB Dateien uunneenesnenene 308 4 1 2 Applikationsinitialisierung ENEE 311 AT Storyboards aneor ki EE 316 ALA Modale Dialoge cser a aai 324 ABs dee 329 41 6 VE BET GAN eessen Ehe 332 Der Navieationcontroller EEN 333 4 2 1 Viewcontroller anzeigen und entfernen 334 4 2 2 Die Navigationsleiste nnesnsenneonsneonsnssnsnesnsnnenannennensensnssnennenn nenne 335 42 3 Der Zur ckbutton tued dee 338 4 2 4 Gehe drei Felder zur ck erer EENS 339 Inhalt Inhalt 4 3 4 4 4 5 4 6 4 7 4 8 5 1 5 2 425 Die Werkzeugleiste un cnuikehiskinbkgeliishinieneinie 343 4 2 6 Navigations und Werkzeugleisten gestalten uunnenesnesenesneenne 345 Navigation und Pop over Controller in der Praxis EE 347 4 3 1 Navigationcontroller anlegen ENEE 351 4 3 2 Einen Dialog f r die Einstellungen gestalten unenesnesenesnenenne 352 4 3 3 Einstellungen dauerhaft speichern 354 4 3 4 Anpassung an das iPad 359 Der Splitviewcontroller AANEREN 362 4 4 1 Das Splitviewcontroller Delegate ENEE 363 4 4 2 Ein praktisches Beispiel SEENEN NENNEN 365 4 4 3 Anpassung des Rotationsverhaltens EE 367 Der Tabbarcontroller u sussnsensensessensensensensen
24. Funk tion CGContextAddEllipseInRect f gt dem Kontext einen Pfad in Form einer Ellipse hinzu Bei einem quadratischen Ziffernblatt haben die beiden Radien dieser Ellipse die gleiche L nge und es entsteht ein Spezialfall der Ellipse ein Kreis Durch den Aufruf der Funktion CGContextFillPath zeichnet schlie lich CoreGraphics einen aus gef llten Kreis mit der gesetzten F llfarbe Pfade in CoreGraphics Sie zeichnen Linien und Fl chen in CoreGraphics indem Sie im Grafikkontext zuerst den Linienzug der Figur beschreiben Danach rufen Sie eine Zeichenoperation f r den Pfad auf mit der Sie den Linienzug ber CGContextStrokePath zeichnen oder ihn ber CGContextFillPath ausf llen Eine weitere m gliche Operation ist das Clip pen ber die Funktion CGContextClip Dabei beschneiden Sie die Zeichenfl che sodass der Kontext nur noch im Bereich des Linienzuges zeichnet 209 3 Views und Viewcontroller Nach der Ausf hrung der Zeichenoperation vergisst der Kontext brigens den Pfad Wenn Sie also einen ausgef llten Kreis mit einem Rand zeichnen m chten m ssen Sie den Pfad des Kreises jeweils vor den beiden Zeichenoperationen zu dem Kontext hinzuf gen Wenn Sie Ihr Programm ausf hren werden Sie feststellen dass immer noch ein wei es Quadrat und ein graues Rechteck angezeigt werden Das liegt daran dass der View f r das Ziffernblatt ebenfalls Wei als Hintergrundfarbe verwendet Er stellt also einen wei en Kreis vor einem
25. Gjeje e Custom Class User Defined aaua Key Path Ty MKMapView UlActionSheet UlActivityIndicatorView UlAlert 5 Class Abbildung 3 9 Der View bekommt die Klasse ClockView zugewiesen Der Interface Builder kennt die Klassenhierarchie Beim Erzeugen des Views haben Sie einen UlView verwendet Damit haben Sie bereits festgelegt dass als Klasse f r diesen View nur UlView oder eine ihrer Unter klassen infrage kommt Daher erscheinen nur genau diese Klassennamen in der Liste Pfiffigerweise haben Sie ja die designierte Klasse ClockView als Unterklasse von UIView deklariert und so kommt sie in der Liste vor und alles passt Die Implementierungsdatei der Klasse ClockView enth lt bereits zwei Methoden Die erste Methode hei t initwithFrame und hat einen Parameter vom Typ CGRect Das ist ein zusammengesetzter Datentyp und keine Objective C Klasse der ein Rechteck ber eine Koordinate und Seitenl ngen die im Folgenden auch Gr e genannt werden darstellt Dieser Typ hat Klasse Sie k nnen einfache Datentypen und C Strukturen in Cocoa nicht am Namen von Klassen unterscheiden Zum Beispiel gibt es eine Klasse NSNumber und einen einfa chen Datentyp NSInteger Es gibt darauf jedoch keinen Hinweis im Namen Objective C erlaubt nur Zeiger als Verweise auf Objekte weswegen die Deklaration NSNumber theNumber zu der Fehlermeldung interface type cannot be statically allocated f hrt
26. Kreis der potenziellen Benutzer dagegen allein dadurch vergr ern dass die App auf allen m glichen Ger ten l uft auch wenn das bedeutet dass Sie nicht alle Annehmlichkeiten der neueren iOS Versionen verwenden k nnen In unserem Beispielprojekt existiert bereits ein View den Sie als Containerview ver wenden k nnen Es ist der Hauptview in den Sie alle Zifferbl tter gelegt haben F r diesen Containerview brauchen Sie auch kein gesondertes Outlet da Sie ber die Property view des Viewcontrollers bereits aufdiesen View zugreifen k nnen Sie k n nen also die Outlet Collection im letzten Listing durch die Property subviews der 233 3 Views und Viewcontroller view Property des Viewcontrollers ersetzen Sie m ssen dazu nur die Zeilen mit den Schleifenk pfen durch for ClockView theView in self view subviews ersetzen Das funktioniert allerdings nur solange Sie keine Views einer anderen Klasse in den Hauptview legen 3 2 4 Viewhierarchien Die Reihenfolge der Subviews im dar ber liegenden View ist entscheidend f r die Anzeige Sie k nnen sich die Reihenfolge in der Baumdarstellung des Views ansehen zu der Sie gelangen indem Sie auf das Symbol am unteren Fensterrand von Xcode 4 klicken siehe Mauszeiger in Abbildung 3 21 A Ges iOS SDK 6 0 e Clock ClockView h n ClockView m 1 ClockAppDelegate h n ClockAppDelegate m MainWindow xib ClockViewController h ClockViewController m
27. Mal zu aktualisieren Eine Aktualisierung reicht aus wenn der Nutzer den Zeiger losl sst 257 3 Views und Viewcontroller Diese Situation k nnen Sie ber die Property state des Gesture Recognizers feststel len Wenn sie den Wert UIGestureRecognizerStateEnded hat hat der Nutzer die Geste beendet Die Qual der Wahl Sie haben drei M glichkeiten zur Gestenverarbeitung kennengelernt Welche ist denn nun die beste Das h ngt nat rlich von dem Anwendungsfall ab Tabelle 3 2 lis tet die verschiedenen M glichkeiten f r die Gestenverarbeitung auf Gestenverarbeitung berschreiben der Responder Methoden Unterklasse von UIControl Unterklasse von UIGestureRecognizer Vor und Nachteile Vorteile 1 Die Gestenverarbeitung auch im Viewcontroller und nicht nur im View m glich 2 Auswertung mehrerer unterschiedlicher Gesten inner halb eines Views Nachteile 1 Gefahr der Verletzung des MVC Musters Abh ngigkeit des Views vom Controller 2 Die Gestenverarbeitung ist mit der Viewklasse fest ver bunden was die Wiederverwendung sehr stark ein schr nkt Vorteile 1 Nutzung des Target Action Mechanismus und dadurch keine Abh ngigkeit des Views vom Viewcontroller 2 Nutzung der Action Connections im Interface Builder 3 Hohe Wiederverwendbarkeit m glich Nachteile 1 Keine eigenen Eventtypen Vorteile 1 Gestenverarbeitung komplett von der Darstellung getrennt 2 Viele fertige Recognizer vorhanden
28. Punkt f hrt CGFloat angleWithPoint CGPoint inPoint CGPoint theCenter self midPoint CGFloat theX inPoint x theCenter x CGFloat theY inPoint y theCenter y 250 3 2 Views und Viewcontroller CGFloat theAngle atan2f thex theY return theAngle lt O theAngle 2 0 M PI theAngle Listing 3 29 Berechnung des Winkels zu einem Punkt Der Winkel den die Funktion atan2 berechnet liegt zwischen n und a Negative Werte m ssen Sie also auf entsprechende positive Werte umrechnen Abbildung 3 29 stellt diese beiden F lle grafisch dar Dabei befinden sich positive Werte auf der rech ten und negative auf der linken Kreish lfte 0 2m atan2 x y A H G 2r atan2 x y T Abbildung 3 29 Umrechnung von Punkten in Winkel Der Zeiger soll sich jedoch nur verstellen lassen wenn die Fingerber hrung in der N he des Zeigers stattfindet Das k nnen Sie am einfachsten erreichen wenn Sie die Methode pointInside withEvent berschreiben BOOL pointInside CGPoint inPoint withEvent UIEvent inEvent CGFloat theAngle self angleWithPoint inPoint CGFloat theDelta fabs theAngle self angle return theDelta lt 2 M PI 180 0 Listing 3 30 Pr fung ob ein Punkt in der N he des Alarmzeigers liegt Die Variable theDelta enth lt den Winkelabstand des Fingers vom Zeiger Wenn die ser Winkel kleiner als 2 ist soll das Control den Touch verarbeiten Mit diese
29. Sie ber Methoden des Application Singletons zugreifen k nnen Cocoa Touch liest die Benachrichtigungen von dort l st sie zum gew nschten Zeitpunkt aus und l scht sie danach falls es sich um eine einmalige Benachrichtigung handelt 3 3 1 Benachrichtigungen versenden Die Methode schedulelocalNotification der Klasse UIApplication f gt eine Benachrichtigung in die Warteschlange ein und cancellocalNotification entfernt sie wieder daraus die Methode cancelAllLocalNotifications entfernt alle Benach richtigungen der App aus der Warteschlange ber die Property scheduledLocalNoti fications k nnen Sie alle Benachrichtigungen aus der Warteschlange auslesen und ab iOS 4 2 k nnen Sie sie auch setzen Sie k nnen in der Warteschlange allerdings nur auf die Benachrichtigungen Ihrer App zugreifen Der Zugriff auf die Benachrichtigun gen anderer Apps ist nicht m glich Ebenso wenig k nnen Sie anderen Apps ber die sen Mechanismus eine Benachrichtigung schicken Die Methoden aus Abschnitt 3 2 8 Direkte Gestenverarbeitung haben die Methode updateAlarm aufgerufen um das Ausl sen des Alarms zu aktualisieren Diese Methode l scht entweder alle Benachrichtigungen der App wenn Sie den Alarm ausgeschaltet haben oder legt ber einen Aufruf der Methode createAlarm eine neue Benachrichtigung an IBAction updateAlarm self alarmHidden self alarmSwitch on if self alarmSwitch on self createAlarm else UIApplication th
30. den Typ retain und bei automatischem Referenzenz hlen hat sie den Typ strong oder optional weak Au erdem m ssen Sie die Klasse ClockView noch im Hea der bekannt machen Dazu k nnen Sie entweder deren Header Datei ber die Anwei sung import ClockView h importieren oder eine Vorw rtsdeklaration mit der Anweisung class ClockView vor der Deklaration der Controllerklasse einf gen Eine Vorw rtsdeklaration sagt dem Compiler dass es die entsprechende Klasse gibt und dass er das Auftreten des Klassennamens nicht als Fehler ansehen soll Aller dings erf hrt der Compiler durch eine Vorw rtsdeklaration nichts ber die Details wie Methoden oder Propertys der Klasse dazu ist eine Importanweisung notwen dig Vorw rtsdeklarationen sind jedoch sehr n tzlich um zyklische Imports zu ver meiden Hilfe bei der Speicherverwaltung Xcode ver ndert nicht nur die Deklaration Ihrer Klasse sondern auch deren Imple mentierung Wenn Sie eine Outlet Property anlegen setzt Xcode in der Methode viewDidUnload die Property auf nil und bei manuellem Referenzenz hlen sendet es in dealloc au erdem noch ein release an das Attribut Mit automatischem Refe renzenz hlen sollten Sie f r Outlets den Speicherverwaltungstyp weak verwenden sofern es sich bei dem verkn pften Objekt nicht um ein Element auf der obersten Ebene im NIB handelt siehe dazu auch Abschnitt 3 2 11 229 3 Views und Viewcontroller Anstelle von Outlet Propertys konnen Sie a
31. h property nonatomic retain readonly NSCalendar calendar Deklaration in der anonymen Kategorie in ClockView m property nonatomic retain readwrite NSCalendar calendar Listing 3 16 Offentliche Read Only und private Read Write Property Sie k nnen nach dieser nderung in der Implementierung von ClockView die Pro perty calendar wie bisher verwenden Au erhalb der Implementierung k nnen Sie die Property dagegen jetzt nur noch auslesen Eine Ver nderung des Wertes ist nicht mehr m glich Tipp Verwenden Sie anonyme Kategorien um Implementierungsdetails Ihrer Klassen nach au en hin zu verstecken Anonyme Kategorien erlauben Ihnen eine klarere Strukturierung Ihrer Schnittstellen 224 3 1 Eigene View Klassen in Cocoa Touch Die Methode updateTime aktualisiert den Wert der Property time Damit Cocoa Touch den View danach auch neu zeichnet m ssen Sie auch noch die Methode set NeedsDisplay aufrufen Sie zeichnet den View allerdings nicht direkt neu sondern markiert ihn nur zum Neuzeichnen Das macht das Betriebssystem erst dann wenn es daf r Zeit hat void updateTime NSTimer inTimer self time NSDate date self setNeedsDisplay Listing 3 17 Aktualisierung der Zeitanzeige Automatische Aktualisierung des Views versus Animationen Die in diesem Abschnitt vorgestellten Methoden dienen zur automatischen Aktuali sierung eines Views Dieses Vorgehen ist f r diesen Anwendungsfall
32. iOS SDK 4 2 AlarmClock AlarmClock xcodeproj PROJECT Sui Q _JAlarmClock AlarmClock gt C Frameworks TARGETS Target Dependencies 0 items M LLER 0 gt C Products Ges gt Compile Sources 5 items KS Accelerate framework KS AddressBook framework Y Link Binary With Libraries 3 items ES AddressBookUl framework a Ke UlkKit framework KS AssetsLibrary framework Required KS Foundation framework Required KS CoreGraphics framework KS AudioUnit framework Required tal KS AVFoundation framework bundle1 o LB KS CFNetwork framework amp CoreAudio framework K CoreData framework K CoreFoundation framework Add Other Cancel Gad gt Copy Bundle Resources 8 items Abbildung 3 39 So f gen Sie ein Framework zu einem Target hinzu 275 3 Views und Viewcontroller Im Hauptfenster befindet sich dann ein Tabulator BUILD PHASES mit dem Abschnitt LINK BINARY WITH LIBRARIES Offnen Sie diesen Punkt durch einen Klick auf das ent sprechende Dreieck Sie k nnen dem Target nun ber das Plus Zeichen neue Frame works hinzuf gen Selektieren Sie im Dialog den Eintrag AUDIOTOOLBOX FRAMEWORK und klicken Sie auf den Button ADD Wenn Sie ein Framework einbinden f gt Xcode sowohl die Bin rdateien mit den ent sprechenden Klassen Methoden und Funktionen als auch die entsprechenden Such pfade f r Headerdateien mit den De
33. ist es sicherlich sinnvoller die Timer nur dann lau fen zu lassen wenn die App sie auch tats chlich anzeigt Die Klasse UIView bietet daf r jedoch keine entsprechenden Methoden an und daf r ist sie auch nicht da F r die generellen Abl ufe in der Applikation ist schlie lich die Controllerschicht zust ndig Und deshalb sollte der Viewcontroller diese Aufgabe bernehmen In 226 3 2 Views und Viewcontroller Cocoa Touch leiten sich die Viewcontroller von der Klasse UIViewController ab Sie bietet vier Methoden an die sie bei einer Anderung des Anzeigezustandes aufruft und die Sie in Ihren Unterklassen berschreiben k nnen Die Methoden hei en viewWillAppear viewDidAppear viewWillDisappear und viewDidDisappear und haben jeweils einen booleschen Parameter Wahrend Cocoa Touch die ersten beiden Methoden bei der Anzeige des Views auf ruft ruft es die letzten beiden beim Verschwinden des Views auf Der Namensbe standteil Will bedeutet dass Cocoa Touch die Methode vor dem Ereignis aufruft w hrend Did darauf hinweist dass Cocoa Touch die Methode nach dem Ereignis auf ruft Der boolesche Parameter gibt dabei jeweils an ob die Anzeige oder das Ver schwinden animiert erfolgt Wenn Sie diese Methoden berschreiben m ssen Sie auch immer die entsprechende Methode in der Oberklasse aufrufen Sie k nnten jetzt also die Uhren in viewDidAppear starten und in viewWillDisappear stoppen und stellen damit sicher dass die Uh
34. repeats YES 223 3 Views und Viewcontroller void stopAnimation self timer invalidate self timer nil Listing 3 15 Starten und Stoppen der Animation Der Aufruf von scheduledTimerhithTimeIlnterval target selector userInfo repeats in der dritten Zeile erzeugt und startet einen kontinuierlichen Timer und weist ihn der Property timer zu Dabei geben der zweite und der dritte Parameter an dass der Timer die Methode updateTime im aktuellen Objekt aufrufen soll Der Doppelpunkt im Selektor zeigt an dass diese Methode einen Parameter erwartet Das Zeitintervall betr gt eine halbe Sekunde damit der Timer die Anzeige zweimal pro Sekunde aktu alisiert Da die Methodenaufrufe nicht in exakten Zeitabst nden erfolgen k nnten bei l ngeren Zeitintervallen z B einer Sekunde sonst Spr nge auftreten was zu ruckelnden Zeigerbewegungen f hrt Anonyme Kategorien erlauben auch das berschreiben der Read Only Eigenschaft von Propertys Dazu m ssen Sie die Property die Sie als readonly in der Schnittstelle der Klasse deklariert haben genau mit den gleichen Parametern und dem Parameter readwrite in deranonymen Kategorie deklarieren Sie d rfen keinen Parameter bis auf readonly in readwrite bei der Redeklaration ver ndern Au erdem m ssen Sie nat rlich im Header auch den gleichen Speicherverwaltungstyp angeben Die Pro perty calendar der Klasse ClockView soll von au en unver nderbar sein Deklaration in ClockView
35. sss 618 cancel An 836 cancelAllLocalNotifications 0 0 270 cancelAuthenticationChallenge 846 CancellLocalNotifleation 270 cancelTrackingWithEvent e 248 canPerformUnwindSegueAction from ViewController withSender 341 canShowCallout EE 877 CAPropertyAnimation 0 eects 592 CAReplicationl aver 589 Carriage Return Lne Feed eee 858 CAScrollLayer ana 579 CAShapeLayer sees 579 CATEXTAYer ee ae 578 CATiledLayer ENEE 623 CATransform3D eeen CATransform3DMakeRotation CAT ranisition eines CDATA Abschnitt EE 789 CENTET aa iin 560 centerCoordinate ss sssissesiisssrssserrssssrrssserssseree 871 Certificate Signing Request 44 Certificates uns a CFBridgingRelease ee CFBridgingRetain CFRele se u eis GERS een nenn CFStringConvertNSStringEncoding ToEncodiN g na danat 781 CFURLRe as en ees 597 CGAfftneTranstomm 560 CGAffineTransformldentity a 561 CGAffineTransformMakeScale 609 EEtOlorRet Eeer dee 577 CGContextAddArt oo eesseessccessssesceessnneeceeeneeeeceneneees 215 CGContextAddfllpselnbect un 209 RER E EE 209 214 CGContextClipToMask e 584 CGContextDrawPDFP age 630 RER e EE 209 CGContextMoveToboint 215 CG EontextRef wince canvass neaes 208 CGContextRestoreGState eee 209 CGContextSaveGState CGContextSelectFont CGContextSetAllowsAntialiasing 623 CGContext etline ap EE 213 996 CGContextSetRGBAFillColor CGContextSe
36. theContext UIGraphicsGetCurrentContext CGRect theBounds self bounds CGContextSaveGState theContext CGContextSetRGBFillColor theContext 1 0 1 0 1 0 1 0 CGContextAddEllipseInRect theContext theBounds CGContextFillPath theContext CGContextRestoreGState theContext xx x Listing 3 3 Zeichnen einer wei en Ellipse Das Rechteck das die Methode drawRect als Parameter erh lt ist nicht die Zeichen fl che sondern nur der Bereich der Zeichenfl che den die Methode neu zeichnen soll Diesen Wert verwenden Sie allerdings in den meisten F llen nicht da dieses Rechteck nur f r eine Reduktion der Zeichenoperationen bei optimierter Ausgabe interessant ist Das ist in der Regel jedoch nur bei sehr gro en oder aufwendig zu zeichnenden Views notwendig 208 3 1 Eigene View Klassen in Cocoa Touch In der ersten Anweisung weist die Methode der Variablen theContext ber die Funk tion UIGraphicsGetCurrentContext den aktuellen Grafikkontext zu in den die Aus gabe erfolgt Cocoa Touch erzeugt den Kontext vor dem Aufruf der drawRect Methode und Sie d rfen drawRect daher niemals direkt aufrufen da dann kein Kon text zur Verf gung steht Wenn Sie einen View neu zeichnen lassen m chten sollten Sie stattdessen die Methode setNeedsDisplay des Views aufrufen Cocoa Touch zeich net den View dann neu sobald das m glich ist Da die Gr e des Ziffernblattes von der Gr e des Views abh ngt ermittelt
37. und Sie beim sechsten Typ UIButtonTypeCustom das Aussehen selbst bestimmen k nnen Ein Custom Button unterst tzt drei Darstellungselemente ein Vorder und ein Hin tergrundbild sowie einen Titel siehe Abbildung 3 25 F r den Titel k nnen Sie au er dem noch die Text und die Schattenfarbe zustandsabh ngig setzen Favoriten Hintergrundbild Titel Vordergrundbild Abbildung 3 25 Die Darstellungselemente eines Buttons Sie k nnen also ber diese f nf Eigenschaften das wesentliche Aussehen des Buttons festlegen wobei Sie das Vordergrundbild und den Titel ber Insets beliebig positio nieren k nnen Das k nnen Sie entweder ber die Propertys imageEdgeInsets bezie hungsweise titleEdgeInsets oder ber den Interface Builder siehe Abbildung 3 26 unterer Bereich machen Uber die Property contentEdgeInsets k nnen Sie au er dem den kompletten Inhalt also Bild und Titel aufeinmal positionieren Wenn Sie f r eine Zustandskombination eine Darstellungseigenschaft nicht definie ren wird stattdessen die des Normalzustands verwendet Im Interface Builder k n nen Sie alle Eigenschaften f r die einfachen Zust nde aber nicht f r Kombinationen aus mehreren Zust nden festlegen Sie k nnen also beispielsweise das Hintergrund bild f r den Zustand selected festlegen hingegen nicht f r selected highlighted Das geht nur ber Programmcode 243 3 Views und Viewcontroller Button Type Rounded Rect D
38. wei en Hintergrund dar Damit Sie den Kreis sehen k nnen ndern Sie die Hintergrundfarbe des Views ff nen Sie dazu den View im Interface Builder und w hlen Sie den View f r das Ziffern blatt aus indem Sie auf die entsprechende Stelle des Hauptviews klicken Mit dem Attributinspektor der zwischen dem Identit ts und dem Gr eninspektor liegt k nnen Sie ber das Attribut BACKGROUND die Hintergrundfarbe des Views ver n dern siehe Abbildung 3 11 W hlen Sie ein freundliches Grau oder die Transparenz CLEAR COLOR aus Bei einem transparenten Hintergrund erscheint an den Stellen die der Kreis nicht verdeckt die Hintergrundfarbe des umgebenden Views AlarmClockviewController xib English View Clock View ss j Pgj j gt eme i Taj C3 Default Fre Recently Used Colors Wm Dark Text Color wa Croup Table View Background Color RSC Light Text Color E Scroll View Textured Background Color E View Flipside Background Color we Clear Color E Light Gray Color Mmmm Black Color C White Color EEE Dark Gray Color Alphi Backgroun Stretchini Other Abbildung 3 11 Der Subview bekommt eine eigene Farbe 210 3 1 Eigene View Klassen in Cocoa Touch Die nderung l sst sich umgehend im Simulator berpr fen das Ziffernblatt ist jetzt sichtbar siehe Abbildung 3 12 ein sch ner runder Kreis Carrier gt Abbildung 3 12 Das Ziffernblatt is
39. 2 Views und Viewcontroller void viewDidAppear BOOL inAnimated super viewDidAppear inAnimated self clockView startAnimation void viewwillDisappear BOOL inAnimated self clockView stopAnimation super viewwillDisappear inAnimated Listing 3 18 Starten und Stoppen der Animation ber den Viewcontroller Au erdem sollten Sie die Headerdatei der Klasse ClockView in diese Implementie rungsdatei einbinden da Sie ansonsten Warnungen bei der bersetzung erhalten Dazu f gen Sie noch die Zeile import ClockView h an den Anfang der Implementierungsdatei ein Hier reicht eine Vorw rtsdeklaration nicht aus da der Controller ja die Methoden und Propertys der Klasse ClockView ver wenden will Setzen Sie diese Importanweisung unter die bereits enthaltene Import anweisung Wenn Sie jetzt Ihr Programm im Simulator ausf hren bewegen sich die Zeiger einer Uhr 3 2 2 Outlet Collections F gen Sie zum Testen noch weitere Uhranzeigen in Ihren View z B so wie im Bei spielprojekt Clock ein die Sie sp ter allerdings wieder entfernen sollten Im laufen den Programm bewegen sich dann nur die Zeiger der Uhr die Sie bereits ber ein Outlet mit dem Viewcontroller verbunden haben Falls Sie eine andere Uhr aktivie ren m chten k nnen Sie einfach ein Gummiband von einem anderen Clockview auf die Outlet Property ziehen dann bewegen sich jedoch nur die Zeiger dieser Uhr Das liegt daran dass der Viewcontr
40. 23 Starten der Animation in Abh ngigkeit von einem Schalter Alles f r die Tonne Denken Sie daran die zus tzlichen Uhren wieder aus dem View zu entfernen Sie brauchen sie f r das Beispielprojekt nicht mehr Ebenso brauchen Sie auch den Schalter nicht mehr Sie k nnen ihn also auch entfernen 3 2 6 Ereignisse Sie haben im Beispielprogramm das Ereignis Value Changed eines Schalters in einer Methode Ihres Viewcontrollers verarbeitet Ein Control kann noch eine Reihe weite rer Ereignisse senden Diese Ereignisse lassen sich in drei Kategorien unterteilen gt Ereignisse f r Wert nderungen gt Ereignisse f r Gesten gt Ereignisse f r Textanderungen 238 3 2 Views und Viewcontroller Ereignisse f r Wert nderungen Dieses Ereignis haben Sie bereits kennengelernt und es hat den Typ UIControlEvent ValueChanged Es wird von Controls gesendet die einen Wert manipulieren Die Klas sen die dieses Ereignis versenden finden Sie in Tabelle 3 1 die Spalte Wert enth lt dabei den Namen der Methode ber die Sie den ge nderten Wert abfragen k nnen Klasse Wert Beschreibung UIDatePicker date Erlaubt die Auswahl eines Datums einer Uhrzeit oder von beidem auf einmal Au erdem kann dieser View einen animierten Countdown anzeigen UIPageControl currentPage Erlaubt die Navigation zwischen verschiedenen Seiten Uber kleine Punkte wie im Springboard UIRefreshControl refreshing Stellt Tableviews eine Standard fun
41. 3 7 Zeichnen eines Ziffernblattes 214 3 1 Eigene View Klassen in Cocoa Touch Anhand der Schleifenvariablen i k nnen Sie entscheiden um welchen Eintei lungstyp es sich handelt Wenn ihr Wert durch 5 teilbar ist i 5 0 muss es ein Strich sein Ist sie au erdem auch durch 15 teilbar i 15 0 so muss es ein langer Strich sein Alle anderen Werte sind Punkte Die L nge der Striche und die Lage der Punkte errechnen sich relativ zum Radius des Ziffernblattes Um die Linien jeweils am gew nschten Punkt beginnen zu lassen m ssen Sie den Startpunkt der Linie setzen ohne den Pfad des Kontexts zu erweitern Dazu verwen den Sie die Funktion CGContextMoveToPoint Teilbarkeit Ob eine ganze Zahl ein Teiler einer anderen Zahl ist k nnen Sie ber den Divisions restoperator ermitteln Wenn der Rest einer Division O ist dann ist der Dividend durch den Divisor teilbar Beispielsweise pr ft der Ausdruck i 5 0 ob der Divi dend i durch den Divisor 5 teilbar ist Zum Zeichnen der Punkte verwendet der Code die Funktion CGContextAddArc Es ist hier einfacher den Kreis ber dessen Mittelpunkt und Radius zu bestimmen als ber sein umgebendes Rechteck ber diese Funktion k nnen Sie beliebige Kreisb gen erzeugen weswegen Sie den Start und den Endwinkel des Bogens im Bogenma angeben m ssen Damit Sie pr fen k nnen ob Sie aufdem richtigen Weg sind sehen Sie hier noch einmal die ganze Methode drawRect an einem St
42. 35 navigationltem sesancccprccrsasseerccsessssasnccrescceretensetensees 336 Navigationsglelsgte secs 330 335 Navigatorspalte EE 885 Le 863 Need to know 697 needsDisplayFOrKey uu 576 602 Debat ei eM tect 863 e GE 300 NIB Date EE 308 Bloen Her 308 Nicht wiederherstellbare Ressource 266 eieiei NISSEN TON ALO ee Nonrtepudiation leg te Notificationcenter KE ee en aiaa N Arrav Literal EE NSAutoreleasePool NSBundle UIKitAdditions eeee 475 NS Calendar ur een 217 NSClassFromMString sses 882 941 N tt ie 220 221 Nat 184 769 773 821 822 NSD te une se Re 84 217 271 NSDateComMponents EEN 271 NSDateFormatter ccccssesescssscessseessseseesesees 83 217 N fictionar unt 186 542 597 822 NSDictionary Literal EE 186 NSEntityDescription e 442 NSFastEnumeration eeeee 853 NSFetchedResultsController ee 487 NSFetchedResultsControllerDelegate 489 NSFetchRequest u essieeneaeiasns 482 NSFileManager 841 N bilebrotectionComplete ue 732 NSFileProtectionCompleteUnlessOpen 732 NSFileProtectionCompleteUntilFirst User Autbentication 732 NSFileProtectionKey een 732 733 NSFileProtectionNone E 732 NSIndexPath m nella NSInputStream NSInteger NSInvocation NSJSONSerialization NSKeyValueChangeOldKey NSKeyValueCoding NSKeyValueObserving NSKeyValueObservingOptionOld NSLayoutConstraint NSLayoutFormatOptions e NSLa
43. 48 Beispielprojekt AlarmClock esesessees 199 316 430 AlarmClock mit Storyboard 316 347 Animation ee EE EE Container ana FlipBookAnimation u s 596 Fototageb ch deet de Ae 217 RefactoredAlarmClock sss 906 Retina somaa Rotation a A OCRE Scroll View SiteSchedule HIEMER KT 474 Untiversoalvoufube 507 UNWINnde antenne 342 Ee eh ee TN Benachrichtigung lokale Mean Benutzercode enensnanees 718 Beobachter ern 120 Bereichsanfrage 840 Bereitstellungsprofil EE 43 Berners Lee Tim 65 Ber hrungsgeste ussssesenenens 239 Beschleunigungssensor ssss ssseeseiiesesrerrereesen Betriebsdokumentation Betriebsumgebung Bewegungssensor Bezeichner Bibliothek einbinden Bibliotheken Bildgr e l gische an essen 280 physikalische 280 Bin ranalyse Bitmaske Bitmenge Bitweises Oder Blacklist Bl tterachse Bogenma Bouncen Boundary BO are Breakpoint Breakpoint Navigator Breakpointleiste Buffer Overflow Bugtracking Buildlog Build Settings Buildsystem Bundle Identifier Bundle Seed ID Button Bytesequenz byValue e CAAnimation CAAnimationGroup CABasicAnimation CACurrentMediaTime CAGradientLayer CAKeyframeAnimation is CAT AY ETs en esse Index Index Calculation Mode EE 598 Callback neuestes 194 868 CAMediafiming EE 598 canCancelContentTouches
44. 5 2 jiCloud in derPraxis jcc rk en 748 7 5 3 Key Value Storage 754 75 4 Verschl sselung in der Cloud nnnssseonneonsneessnssnsnnennnnsnnensenensensenene 756 Datenserialisierung und Internetzugriff 765 Ich packe meine Texte ENEE EEN 765 8 1 1 Serialisierung von Zeichenketten ENEE 765 8 1 2 Zeichenkodierungen csssesessecessecsescencesecessecesecsesecncensncenenecnsseeseeseesees 766 8 1 3 Unicode und HIER ee EA 767 8 1 4 Die Zeichenkodierung erkennen ns ssssssssssssrssssssersrrsessreresrrtsssrrrsssrersssere 768 8 1 5 Zeichenketten konvertieren s ssssesssssesseeeesseseesereeessrcoossscossseosnseessseeesseeet 769 JSON und die URLonauten 770 8 2 1 DasJSON Formaten ana Th 771 8 2 2 Einfacher YouTube Zugriff mit JSON EE 772 8 2 3 URLs erstellen 779 UU Inhalt Inhalt 8 2 4 JSON Dokumente schreiben 0 ecsscescsssscessecesseeseneeeceneeessecesseeserseeceneee 783 8 2 5 Verwendung des JSONKits als Parser NEEN 784 Ce 786 8 3 XML KUTE Sail ehh ie hie sR eee engen 786 8 3 2 Property Listen uer 791 8 33 euer EES Ze 795 8 3 4 DOM UNG XPath ress csstsnedacdeesecdesssessesnedasseussazoedssascabecs ken Weeer 810 8 3 5 Der Tag der Entscheidung ssseccsccscssessessecesseesescarsncessecesseeserececenene 819 8 4 Daten Daten ihr miisst wandern 84 1 Synchrone Kommunikation 8 4 2 Komplexe Anfragen nanninta e Ba E EA 8 4 3 Auf dem Webserver nichts Neues 8 4
45. 6 Das Buildsystem 2 ENEE 919 9 4 1 Workspaces Projekte und Targets ENEE 920 9 4 2 Klassen in Bibliotheken auslagern EE 921 9 4 3 Bibliotheken wiederverwenden sesesninncancenennin i onna 927 9 4 4 Konfigurationen 9 457 El EE 9 46 E E Ad Hoc Distributionen ENEE 946 Ob Ger teregistrier ng steet EEN 946 9 5 2 Installation ber das iPhone Konfigurationsprogramm unnenenen 949 9 5 3 Ad Hoc Distributionen ber einen Webserver nennen 950 Versionsverwaltung mit Git ENNEN 952 9 6 1 Lokale Git Repositorys see NEEN 954 9 6 2 Arbeiten mit verteilten Git Repositorys aenesssnenseneesenennennensnensenensenennene 955 9 6 3 Git Integration in Xcode een 956 9 6 4 Einbindung existierender Git Repositorys uesessensesenennennensnnensenensenennene 960 9 65 GH E 962 966 Bourg Tree eier regeiert deed 963 9 6 7 Das Kommandozeilenprogramm von Git ueeessenseseneenennensnnensensnsenennene 965 9 6 8 Der eigene Git Server Sicherer Entwicklungszyklus EEN 975 13 Inhalt Kapitel 3 Views und Viewcontroller Never put off till tomorrow what you can do the day after tomorrow Mark Twain In diesem Kapitel werden Sie einen analogen Wecker programmieren und dabei den grundlegenden Aufbau von iOS Apps kennenlernen Dabei stehen die Arbeit mit Xcode und die praktische Anwendung der theoretischen Grundlagen im Vorder grund die wir in den ersten beiden Kapiteln beschrieben haben Au erdem gestalten Sie eine ein
46. ExpectedToWrite 835 connection willSendRequestFor AuthenticationChallenge 846 Connection Delegate EE 834 connectionDidFinishLoading 835 connectionWithRequest delegate 834 constraintsWithVisualFormat options IESELEN 427 ContainervieW EE Containerviewcontroller F containsObjeet e mania 188 Content Disposition s ssssssiirsssssirrsrsserrrrsessen 857 COntentINS Etna See 612 Content Length tee a 827 GEES HCH estate 612 CONTENTS a A 572 584 597 contentSize 612 contentstreteh ere Ai 560 Cont ntely pe Armani 827 CONTENT VIC W secesssesncsesacesanesessnccssnesasncssesuieshavcestesebets 475 CONNUS ae 883 Eet le een 299 continueTrackingWithTouch withEvent 248 continueWithoutCredentialFor AuthenticationChallenge 846 Kontroll a ee 236 Controller 73 controller didChangeObject atIndexPath forChangeType newIndexPath 491 controller didChangeSection atIndex forChangel ype tee 493 controllerDidChangeContent u eoo 491 Controllerschicht sssssssssss11111111111001000000ssssss10s controllerWillChangeContent Controlzustand Convenience Konstruktor convertPoint fromView convertRect toView convertTime fromLayer coordinate COPY anne 154 176 186 192 copyWithZone EE 156 Core Animation 570 Core Data Core Foundation Speicherverwaltungsregeln Core Graphics Core Graphi
47. GContextFillPath theContext self drawClockHands CGContextRestoreGState theContext Listing 3 8 Die komplette Methode zum Zeichnen des Ziffernblattes Abbildung 3 14 Das Ziffernblatt des Weckers 216 3 1 Eigene View Klassen in Cocoa Touch Die Methode drawClockHands deren Aufruf am Ende von drawRect erfolgt zeichnet die Zeiger des Weckers F r die Implementierung m ssen Sie die aktuelle Systemzeit in Winkel umrechnen damit Sie die Zeiger durch Linien darstellen k nnen 3 1 2 Zeitberechnung Der ClockView soll die angezeigte Zeit in der Property time speichern Diese hat den Typ NSDate dessen Objekte einen Zeitpunkt enthalten der auf einem Referenzzeit punkt basiert Da die Property das Datumsobjekt halten muss bekommt sie den Speicherverwaltungstyp retain Das Datumsobjekt enth lt den Zeitpunkt als Anzahl der Sekunden zu einem festgelegten Referenzzeitpunkt dem 1 Januar 2001 in der Zeitzone Greenwich Mean Time GMT Hingegen ist die Umrechnung des Zeitpunk tes in eine Datumsdarstellung sehr schwer Daf r gibt jedoch es gl cklicherweise spe zielle Klassen Diese Darstellung von Datumswerten klingt zun chst unn tig kompliziert hat indes einige Vorteile gt Sie k nnen mit Datumsobjekten gut rechnen Beispielsweise k nnen Sie einen weiteren Zeitpunkt durch Addition eines positiven oder negativen Zeitintervalls berechnen gt Der Wert eines Zeitpunktes hat berall auf der Welt und zu jed
48. Galileo Computing Apps programmieren f r iPhone und iPad Inkl Xcode Debugging Versionierung zahlreiche Praxisbeispiele Aktuell zu iOS 6 Bearbeitet von Klaus M Rodewig Clemens Wagner Neuausgabe 2012 Buch 1012 S ISBN 978 3 8362 1915 0 Format B x L 168 x 24 cm Weitere Fachgebiete gt EDV Informatik gt Programmiersprachen Methoden gt PDA amp Handheld Programmierung schnell und portofrei erhaltlich bei beck shop de DIE FACHBUCHHANDLUNG Die Online Fachbuchhandlung beck shop de ist spezialisiert auf Fachb cher insbesondere Recht Steuern und Wirtschaft Im Sortiment finden Sie alle Medien B cher Zeitschriften CDs eBooks etc aller Verlage Erg nzt wird das Programm durch Services wie Neuerscheinungsdienst oder Zusammenstellungen von B chern zu Sonderpreisen Der Shop f hrt mehr als 8 Millionen Produkte Klaus M Rodewig Clemens Wagner Apps programmieren fur iPhone und iPad Das umfassende Handbuch Apps entwickeln f r iPhone und iPad Das Praxisbuch W A Galileo Press Auf einen Blick Auf einen Blick I IHN O IPI OMG zeessen ee Seier 21 2s Grundlag EE 55 3 Views und Viewcontroller EE 199 4 Alles unter Kontrolle EE 307 5 Daten Tabellen und Controller o sssssseeesssesssssssessssssrerssesssrsseerssesssresrersserssreee 405 6 Models Layer Animationen EEN 529 7 Programmieren aber sicher EEN 655 8 Datenserialisierung und Internetzugriff AEN 765 9 Jahrm
49. Methode um eine Actionmethode handelt zu der Actionverbindungen erlaubt sind Die drei m glichen Signaturen f r Actionmethoden sind IBAction methodenName IBAction methodenName id inSender IBAction methodenName id inSender 2 forEvent UIEvent inEvent Listing 3 20 M gliche Signaturen f r Actionmethoden Den Methodennamen k nnen Sie dabei nat rlich frei w hlen Der erste Parameter in der zweiten und dritten Variante enth lt das Control das das Ereignis abgeschickt hat Als Typ wurde hier id verwendet der auf jede Klasse passt Sie d rfen jedoch auch einen konkreten Typ beispielsweise UIButton verwenden Dann k nnen Sie in der Methode auch die Punktnotation f r dieses Control verwenden ber den Event Parameter der dritten Variante k nnen Sie zus tzliche Informatio nen ber das ausl sende Ereignis ermitteln Dar ber erhalten Sie beispielsweise die genauen Fingerpositionen zum Ausl sezeitpunkt Die liefert Ihnen der Event in Objekten der Klasse UITouch Eine M glichkeit die Fingerposition zu bestimmen stellt Listing 3 21 dar Dabei bestimmt die Methode locationInView die Fingerposi tion immer relativ zu dem angegebenen View Das Listing berechnet sie also relativ zu dem Control das das Ereignis ausgel st hat IBAction touchWithSender id inSender forEvent UIEvent inEvent UITouch theTouch inEvent allTouches anyObject CGPoint thePoint theTouch locationInView inSender To
50. Methoden verwenden Die Initialisierung eines Objekts aus einer NIB Datei erfolgt ber initWithCoder sofern sie diese Methode besitzt Bei allen anderen Klassen kommt die Initialisierungsme thode init zum Einsatz Da die Klasse UIView das Protokoll NSCoder adaptiert und 220 3 1 Eigene View Klassen in Cocoa Touch somit diesen Initializer bereitstellt erfolgt die Initialisierung immer dartiber Sind alle Objekte aus der NIB Datei geladen und initialisiert sendet Cocoa Touch an jedes Objekt die Nachricht awakeFromNib die es von NSObject erbt Diese Methode k nnen Sie also berschreiben um ein Objekt erst dann zu initialisieren wenn Cocoa Touch alle Objekte aus der NIB Datei geladen hat Den Ablauf f r die Initialisierung eines Views stellt Abbildung 3 15 grafisch dar initWithCoder vorhanden nein gt init senden ja t initwithCoder alle Views aus senden NIB laden awakeFromNib senden Abbildung 3 15 Ablauf der Initialisierung f r Views aus NIB Dateien Wie bereits weiter oben erwahnt wurde sind alle Objekte in einer NIB Datei als seria lisierte Daten abgelegt Die Serialisierung enthalt alle notwendigen Informationen um diese Objekte wiederherzustellen Zu diesen Informationen geh ren die Klassen die Attributwerte und die Anordnung der Objekte zueinander Wahrend NIB Dateien daf r ein kompaktes bin res Dateiformat verwenden verwenden XIB Dateien und Sto
51. Umgekehrt d rfen Sie dagegen Zeiger auf einfache Datentypen deklarieren 1 Ein C Struct 2 In der Deklaration fehlt der Stern zwischen dem Klassennamen und der Variable 205 3 Views und Viewcontroller Die Deklaration NSInteger theInteger ist erlaubt und erst bei der Zuweisung erhalten Sie in der Regel eine Warnung Falls Sie sich nicht sicher sind was ein Name im Quelltext beschreibt k nnen Sie durch cmd linke Maustaste zur Dekla ration dieses Namens gelangen Das funktioniert praktischerweise mit fast allen Bezeichnern im Quelltext Bei Bezeichnern aus Cocoa k nnen Sie auch alt linke Maustaste dr cken um eine kurze Dokumentation zu erhalten In Objective C gibt es keine Konstruktoren die Sie vielleicht aus anderen Pro grammiersprachen kennen Die Objekterzeugung ist vielmehr in Speicherplatz reservierung und Objektinitialisierung aufgeteilt Die Klassenmethode alloc zur Speicherplatzreservierung haben Sie bereits kennengelernt Sie reserviert den not wendigen Speicherplatz und f llt ihn mit Nullen Initialisierungsmethoden kennen Sie ebenfalls schon seit dem zweiten Kapitel In Objective C hei en sie per Konvention entweder init oder haben das Pr fix init Wenn Sie einen View ber den Programmcode anlegen sollten Sie in der Regel die Initialisierungsmethode initWithFrame verwenden Der Parameter ist ein Rechteck das die Gr e und Position des neuen Views relativ zu dessen umgebendem View dem Superview
52. Valles us N 593 597 valueWithCATransform3D u 610 Veillard Daniel 811 Ver nderliche Objekte 174 Verbindung ziehen 228 Verbindungsinspektor eee 123 230 Vererbung 58 61 Verf gb rkeit ua er Vergleichsoperator EE Verhalten Aussee Versionsverwaltung Vertraulichkeit 690 VIEW essen Saver A 262 266 Viewaustrichtung 367 416 Viewcontroller Anzeigezyklus Lebenszyklus viewControllers viewDidAppeatl viewDidDisappeat viewDidLayoutSubviews viewDidLoad viewDidUnload 229 264 267 viewForZoominglnScrollView 0 0 615 Viewgeometrie 206 Viewhierarchie Viewtransition viewWillAppear 54 227 266 361 388 viewWillDisappear 130 227 266 viewWillLayoutSubviews viewWillUnload Visual Format Language Vlissides John V Modell Vorabkontrolle Vorw rtsdeklaration f r ein Protokoll f r eine Klasse Vorzeichenlose behaftete Darstellung 766 W WebDAV Webfreigabe aktivieren Werkzeuglelste 330 343 451 884 Wiederherstellbare Ressource Wiederverwendbarkeit Wight Jonathan Wildcard Profil willChangeValueForkey u willMoveToParentViewController Wireless Wide Area Network Wischnavigation sss ssessssseissserrssesrrsesrrsserrsserrsseee Index Index Workspace 885 20 Y Wrapped ME 578 wrapper Bibliothek CS BE de ERR 770 writ
53. a bereits kennengelernt haben Das n chste Kapitel stellt mehrere M glichkeiten vor View controller anzuzeigen und wieder verschwinden zu lassen 3 2 11 Speicher und Ressourcenverwaltung des Viewcontrollers Ein Viewcontroller verwaltet in der Regel mehrere Ressourcen Das sind beispiels weise Views und andere Objekte die er f r seine Aufgabe ben tigt und die seinen Zustand abbilden Dabei besteht ein Unterschied zwischen wiederherstellbaren und nicht wiederherstellbaren Ressourcen Zum Beispiel k nnen Sie Views in der Regel wiederherstellen indem Sie sie aus einem NIB oder Storyboard laden beziehungs weise die Programmanweisungen mit deren Erzeugungscode wieder ausf hren Nicht wiederherstellbare Daten k nnen Nutzereingaben sein die Sie nicht anderwei tig gespeichert haben Der Controller kann und sollte wiederherstellbare Ressourcen freigeben sobald er sie nicht mehr ben tigt Dadurch vermindern Sie den Speicherverbrauch und erh hen 266 3 2 Views und Viewcontroller die Stabilitat der App Der Freigabezeitpunkt hangt dabei in der Regel vom Erzeu gungszeitpunkt ab und die Lebenszeit einer Ressource l sst sich f r gew hnlich einem der drei Zyklen des Viewcontrollers zuordnen 1 Ressourcen die der Controller in den Initialisierermethoden oder in awakeFromNib erzeugt sollte er auch erst bei seiner Zerst rung wieder freigeben Diese Ressour cen haben also den gleichen Lebenszyklus wie der Vewcontroller Dazu geh r
54. allerdings auch das Laden er zwingen indem Sie die Property auslesen Sie k nnen daf r Ihrem Viewcontroller beispielsweise die folgende Methode hinzuf gen 265 3 Views und Viewcontroller BOOL forceLoadView return self view nil Listing 3 40 Methode zum Laden des Views eines Viewcontrollers Der Zugriff auf die Property in der zweiten Zeile erzwingt das Laden des Views Den Ladezustand des Views k nnen Sie ber die Methode isViewLoaded erfragen Die Methode loadView l dt den View aus der NIB Datei Sie k nnen diese berschrei ben um den View durch Code zu erzeugen Dazu weisen Sie der Property vieweinfach Ihren erstellten View zu In diesem Fall sollten Sie indes nicht die Methode in der Oberklasse aufrufen Cocoa Touch ruft nach dem Laden des Views die Methode view DidLoad auf die Sie ja auch bereits kennengelernt haben Tipp Wenn Sie Ihren Viewcontroller oder dessen View nach dem Laden initialisieren m chten sollten Sie dazu die Methode viewDidLoad berschreiben Wegen der feh lenden Outlet Verbindungen ist ja die Methode awakeFromNib in den meisten F llen nicht daf r geeignet Die Methode loadView ist zum Laden des Views gedacht und sollte auch nur daf r berschrieben werden Sie k nnen jetzt Ihren Viewcontroller beliebig oft anzeigen und wieder verschwin den lassen In diesen Anzeigezyklen ruft Cocoa Touch viewWillAppear viewDid Appear viewWillDisappear und viewDidDisappear auf die Sie j
55. angibt Da Cocoa Touch die Views in einer Hierarchie anordnet hat fast jeder View einen umgebenden View das ist jeweils dessen Vorg nger in der Hie rarchie Der Aufbau der Methode ist im Allgemeinen wie folgt id initWithFrame CGRect inFrame self super initWithFrame inFrame if self nil Initialisierung des Objekts return self Listing 3 2 Initialisierungsmethode eines Views Viewgeometrie Die Klasse UIView besitzt zwei Rechtecke die die Position und die Ausma e des Views beschreiben Die Property frame enth lt wie bereits beschrieben die Position und die Gr e des Views relativ zu seinem umgebenden View Die Position des Fra mes gibt also die Entfernung der oberen linken Ecke des Views von der oberen lin ken Ecke seines umgebenden Views an siehe Abbildung 3 10 links Der gezeichnete View muss hingegen nicht auf dem Rechteck liegen das der Frame beschreibt Diese Koordinaten gibt das Rechteck in der Property bounds an 206 3 1 Eigene View Klassen in Cocoa Touch Die Bounds beschreiben also die Lage des Views relativ zu dessen Frame In den meisten Fallen ist die Position der Bounds der Nullpunkt und die Gr e entspricht der Gr e des Frames Abbildung 3 10 rechts Das klingt recht kompliziert F r den Anfang k nnen Sie sich zwei einfache Faustre geln merken 1 Sie ver ndern die Gr e und die Position eines Views in der Regel ber dessen Frame 2 Wenn Sie die Koordina
56. anzeigen Seen 630 Uber diese Br cke musst du gehen ccccsssssssssessssssscssssecessseccesssecessseesessesces 637 6 5 1 Toll Free Bridging und ARC EEN 637 6 5 2 C Frameworks und ARC unse sg sata 639 Was Sie schon immer ber Instruments wissen wollten aber nie ZU fragen wagten 2n00esenensensnsensnsensnnennnnsnnsnsensnsensnnensnnennnnsnsnnsnntnsentnnense 6 6 1 Spiel mir das Lied vom Leak 6 6 2 Ich folgte einem Zombien 6 6 3 Time Bandits 71 72 73 7 4 7 5 8 1 8 2 Programmieren aber sicher 655 iOS und Hardware Acte k na E nis 656 Bedrohungen Angriffe Sicherheitsl cken und Ma nahmen 661 Tad Arten von Sicherheitsl cken u a 662 Threat Modeling 2 ner ee aai 664 73 1 Erstellen eines DatenflussdiagramMms ss sssssssssssrrssrsrssrssesrerssrrrssrrrssseees 666 7 3322 STRIDE2 2 2208 eis innen an 689 7 3 3 Generische Design Grunds tze EEN 697 7 3 4 Threat Modeling aus der Tube das Microsoft SDL Threat Modeling To6l 2 22 IRRE 698 Sichere Programmierung in der Praxis 703 TAA Avthentisierung ergeet ee EE 704 7 42 KEY CHAIN eeh EEN 718 74 3 Jailbreak Erkennung eee 726 7 4 4 Verzeichnisse und Dateiattribute 732 TAS Event Handling edd 735 74 6 Screenshots 738 74 7 Sorgfaltiger Umgang mit der Bildschirmsperre 739 7 4 8 Struktur und Ordnung im Sandkasten EE 740 Le RE ans 744 75 1 De nkanstoBe natin Hark 746 7
57. arkt der N tzlichkeiten AEN 883 10 Sicherer Entwicklungszyklus AEN 975 Inhalt GONE FEW eer e eer eons deans EE ee 15 VORWOKE okaim a inden a alina ie oanaan 17 1 Hello iPhone 21 Lt Voraussetz ngen EEN rue Bu 22 1 1 1 Das SDK und die Entwicklerprogramme sssssssssesssesssrrisssrirsssrerssrresssresse 22 1 1 2 Der Simulator eru 25 1 1 3 Test der Arbeitsumgebung u eunesosnnenensenennsnsennensorsnsnnnneonnnsnnsnennnnnene 26 1 2 32 2 Ein neues Projekt 32 Ja Sebrverbungdem geseet ee 37 1 2 3 Netzwerk und Ausgabe 41 1 2 4 hestauf einem Gerit u ns EE 43 1 2 5 Entwicklungszertifikat und Entwicklungsprofile nn 44 1 2 6 Entwicklerprofile ohne Wildcards 50 12 7 Profilpr bleme u eseensesehesketeesskn Ah 52 1 3 Zusammenfassung i 2 22 0 40 54 2 Grundlagen 55 2 1 Objektorientierte Programmierung ENEE 56 2 1 1 Objekte und Abstraktion u esnsennosesnneonsnennsneansnenurnnennnennrnenusnennnnnene 58 2 1 2 Vererbung EE EE 61 2 1 3 Uberschreiben von Methoden und sp tes Binden csssssssseeseeeeeeeesees 64 2 1 4 Objektorientierung in Objective C un 65 2 1 5 Die Architektur von iOS Programmen nenessnensensnsenennennensnnensenensenenene 73 2 2 Hefte rauis Klassepnarbettt use 75 2 2 1 Controller und View in der Praxis 77 2 2 2 Modellbau 85 2 2 3 Initializer und Methoden 90 2 24 Vererbung 100 2 2 5 Kategorien 112 2 2 6 Protokolle 117 In
58. atenm dellierung 2s240me aa aan 435 5 4 2 Implementierung von Entit tstypen ss sessessessessesresssrtesssriesssrersssrersrereeses 438 5 4 3 Einbindung von Core Data 544 Der Objektk ntext aaen 5 4 5 Die Nachrichten des Objektkontexts EEN 443 5 4 6 Anlegen und ndern von Entit ten in der Praxis s ssssssesssssssssss111eees1es 443 Texte Bilder und T ne verwalten 0 00s0nsno0000000000005ososesseseesoseesossnsessssereesens 447 5 5 1 Die Tastatur betritt die B hne ENEE 447 5 5 2 Fotos aufnehmen eeneg EEN 453 5 5 3 T ne aufnehmen und abspielen 0 0 eseesecseseeseeeesececeeseeeeeeeseeeeseaeeeeees 461 Tableviews und Core Data ENNEN SEL Tableviewsn a er nn ae 5 6 2 Tabellenzellen gestalten 5 6 3 Tableviews unter iOS 5 5 6 4 Buttons in Tabellenzellen 5 6 5 Zellen l schen a See Core Data Il Die R ckkehr der Objekte EEN 482 5 7 1 Pradik te gaere 483 5 7 2 Aktualisierung des Tableviews NEE 486 5 7 3 Das Delegate des Fetchedresultscontrollers enneeenneeeneenenene 489 5 74 Tabelleneintr ge suchen secssecesseceescecsssccesseceeseeserececsececeneceeneeeesees 493 Twitter u 0 28 28 E E 496 58 1 Der Twitter Account a are ineukeengelennesenndanenenn 497 5 8 2 Hinzuf gen des Twitter Frameworks EE 498 5 83 Integration in das Fototagebuch ENEE 500 Collerhotwlewe ease 507 5 9 1 DerCollectionviewcontroller EEN 508 59 27 Gitterd rstell ng u anni a 509 5 9 3 Zellen un
59. auch durchaus ausreichend da Sie die Zeiger nur zweimal pro Sekunde neu zeichnen m ssen Bei jeder Aktualisierung zeichnet der View nicht nur die Zeiger sondern auch das kom plette Ziffernblatt neu Die Uhr l uft trotzdem fl ssig Dieses Vorgehen eignet sich allerdings nicht f r beliebige Animationen da dort in der Regel h ufigere Aktualisierungen des Views notwendig sind Au erdem gibt Ihnen Cocoa Touch daf r mit Core Animation ein viel besseres System an die Hand und einfache Animationen lassen sich au erdem problemlos ber Klassenmetho den von UIVien realisieren Mehr dazu finden Sie in Kapitel 6 Models Layer Ani mationen 3 1 5 Wiederverwendbarkeit von Views Die Klasse ClockView weist bis jetzt keine Abh ngigkeiten vom Viewcontroller oder vom Application Delegate auf Sie ist also vollkommen unabh ngig von der Control ler oder sogar der Modellschicht des Programms Das ist so gewollt und soll auch so bleiben Die Unabh ngigkeit erlaubt es Ihnen beliebig viele Uhren in Ihrem Projekt anzulegen Sie k nnen also erneut die XIB Datei ffnen und weitere ClockView Objekte so wie oben beschrieben anlegen Sie brauchen dazu einfach nur im Interface Builder wei tere UIView Objekte auf den Hauptview ziehen und die Klasse der neuen Objekte auf ClockView zu setzen Sie k nnen sogar die Header und die Implementierungs datei der Klasse in ein anderes Projekt bertragen und den View dort ohne Ein schr nkungen oder weite
60. azu alle Views auf die Sie gesammelt zugreifen m chten in einem gemeinsamen gegebenenfalls nicht sichtbaren View an und auf diesen View greifen Sie ber ein herk mmliches Outlet zu H ufig ver wendet man f r diese Containerviews ein UIView mit transparenter Hintergrund farbe der nur zur Beherbergung anderer Views dient An die einzelnen Views gelangen Sie dann ber die Property subviews des Containerviews Allerdings kann dabei jeder View nur in maximal einem Containerview liegen Unterst tzung lterer i0S Versionen Programmierer neigen dazu immer die aktuelle Version des Betriebssystems voraus zusetzen Bei den Endanwendern sieht das allerdings anders aus Apple unterst tzt iOS 4 und erst recht iOS 5 nicht oder nur eingeschr nkt auf lteren iPhones und iPod touches Besitzer eines iPhone 2G m ssen mit iOS 3 vorliebnehmen und iOS 5 l uft nicht mehr auf einem 3G Mit zunehmender Vielfalt von Cocoa Touch Ger ten ist damit zu rechnen dass es auch immer eine nicht gerade kleine Benutzergruppe gibt die nicht die aktuelle Version von iOS verwenden kann berlegen Sie daher vor der Verwendung neuer Features welche Reichweite Ihre App haben soll Falls die App bez glich der Hardware Ressourcen sehr anspruchs voll ist oder wenn sie Funktionen ben tigt die erst ab iOS 5 oder iOS 6 zur Verf gung stehen ist die Unterst tzung lterer Ger te nicht m glich Bei einer App ohne besondere Hardware Anforderungen l sst sich der
61. brigens gut im Simulator testen Rufen Sie dazu einfach den Men punkt HARD WARE SPEICHERWARNHINWEIS SIMULIEREN auf dann sendet der Simulator eine Speicherwarnung an Ihre App 3 3 Lokale Benachrichtigungen Dem Wecker fehlt jetzt nur noch ein Alarmton der zur gew hlten Zeit erklingt Sie k nnen nat rlich die Zeitdifferenz zum aktuellen Zeitpunkt berechnen und einen Timer starten Dieser ruft nach Ablauf der Zeit eine Methode auf die einen Ton abspielt Das funktioniert allerdings nur wenn Ihr Programm die ganze Zeit im Vor dergrund weiterl uft Sie k nnen also Ihr iPhone in der Zwischenzeit nur einge schr nkt nutzen Das Beispielprogramm verwendet stattdessen lokale Benachrichtigungen die Apple mit iOS 4 0 eingef hrt hat Das sind zeitgesteuerte Ereignisse die das Betriebssystem zu einem bestimmten Zeitpunkt ausl st Eine lokale Benachrichtigung kann beim Ausl sen eine Nachricht auf dem Bildschirm anzeigen eine Audiodatei abspielen oder den Wert im Badge der App auf einen festen Wert setzen Die Badges sind die roten Plaketten am App Icon die viele Apps z B Mail verwenden siehe Abbildung 3 36 Lokale Benachrichtigungen funktionieren auch wenn Sie Ihre App in den Hin tergrund schicken oder sogar stoppen Vor iOS 5 hat Cocoa Touch die Nachrichten in einer Alertbox angezeigt siehe Abbil dung 3 37 und seit iOS 5 erfolgt die Anzeige ber die Mitteilungszentrale Sie stellt lokale Benachrichtigungen standardm ig als Ba
62. ck und die Ausgabe sehen Sie in Abbildung 3 14 void drawRect CGRect inRectangle CGContextRef theContext UIGraphicsGetCurrentContext CGRect theBounds self bounds CGFloat theRadius CGRectGetWidth theBounds 2 0 CGContextSaveGState theContext CGContextSetRGBFillColor theContext 1 0 1 0 1 0 1 0 CGContextAddEllipseInRect theContext theBounds CGContextFillPath theContext CGContextAddEllipseInRect theContext theBounds CGContextClip theContext CGContextSetRGBStrokeColor theContext 0 25 0 25 0 25 1 0 CGContextSetRGBFillColor theContext 0 25 0 25 0 25 1 0 CGContextSetLineWidth theContext 7 0 CGContextSetLineCap theContext kCGLineCapRound for NSInteger i 0 i lt 60 i 215 3 Views und Viewcontroller CGFloat theAngle i M PI 30 0 if i 5 0 CGFloat theInnerRadius theRadius o i 15 0 0 7 0 8 CGPoint theInnerPoint gt self pointWithRadius theInnerRadius 2 angle theAngle CGPoint theOuterPoint gt self pointWithRadius theRadius angle theAngle CGContextMoveToPoint theContext theInnerPoint x theInnerPoint y CGContextAddLineToPoint theContext theOuterPoint x theOuterPoint y CGContextStrokePath theContext else CGPoint thePoint self pointWithRadius theRadius 0 95 gt angle theAngle CGContextAddArc theContext thePoint x thePoint y gt 3 0 0 0 2 M PI YES C
63. cs Pfad cornerRadius Customlayout customView CXMLDocument CXMLElement CXMLNode D Dahl Ole JOW any a usa Dangling Pointer dataUsingEncoding dataWithContentsOfURL options ION else 184 822 dataWithJSONObject options error 783 dataWithPropertyList format e lee E 794 Dateiattribut Dateiinspektor Dateisysteme D tei Upload anne Index Index Debug Navigator 887 Bebug Ansicht na 41 Deb gger un enesesniee 294 Debuggerbefehl ueeeeee 298 Debuggerbereich a heesenns 293 Debug Information eeee 987 Debug Konfiguration 930 Debugssmbol iergert 913 Decoration View E 507 defaultActionForkey ee 603 defaultCenter nnasamenn es 406 defaultValueForkey uneee 575 602 Defense in Depth EEN 698 Delays Content Touches 622 delaysContentTouches eet 622 D l ga tenoaren a 126 delegaterna a a ancien 572 TE EE 126 delegate method ai 72 Delegate Protokoll 132 396 Delegation au ae lei 74 125 und Responder Methoden ss ssesisssrsse 248 deleteRowsAtIndexPaths withRow Animationi nenne 492 dequeueReusableSupplementaryView OfKind withReuseldentifier 998 Designierter Initializer EEN 93 Detailviewcontroller Dictionary und Zahlen dictionaryWithContentsOfFile dictionaryWithContentsOfURL dictionaryWithObjectsAndKeys didChangeValueForKey didMoveToParentViewController didRecei
64. ctionElementKindSectionHeader 514 U U U U U U U U U U U U U U U U U U U ICollectionReusableView ICollectionViewCell ICollectionViewController uuu 507 ICollectionViewDelegateFlowLayout ER ICollectionViewFlowLayout ICollectionViewLayout ICollectionViewLayoutAttributes 51 JEontrol Geert d 236 242 248 61 IControlEventEditingDidBegin 241 IControlEventEditingDidChange IControlEventEditingDidEnd IControlEventEditingDidEndOnExit IControlEventTouchCancel IControlEventTouchDown IControlEventTouchDownRepeat IControlEventTouchDragEnter IControlEventTouchDragExit IControlEventTouchDraglnside IControlEventTouchDragOutside 240 Index Index UIControlEventTouchUpInside 240 UlControlEventTouchUpOutside 240 UlControlEventValueChanged 239 UlControlStateDisabled ue 242 UlControlStateHighlighted u 242 UlControlStateSelected ece 242 UD tePicker n anisseniden ste 239 VIDEVICE A Rs 291 313 416 UlEdgeInsetsMake EEN 612 TE VOI an ana 247 UlGesturebecognizer 255 256 UlGestureRecognizerStateEnded 258 UIGraphicsBeginImageContext eee 461 UIGraphicsBeginImageContextWith OPti ns ueesenkas hai 583 UIGraphicsGetCurrentContext 209 461 U U UllmagePNGRepresentation eee 458 UlInterfaceOrientationIsLandscape
65. d die Datenquelle EEN 512 5 9 4 Erg nzende Views 5 95 FreieLayouts eege 5 9 6 Freie Layouts und erg nzende Views uanennsnesensnnensensnsensnnennennnnensenennn 523 59 7 Zellenaswablen ged 525 5 9 8 Dec rationviews unumstritten 526 Inhalt Inhalt 6 1 6 2 6 3 6 4 6 5 6 6 10 Models Layer Animationen 529 Modell und Controller AE 530 61 1 TOS Next Topmodel giess Eeer 530 6 1 2 View an Controller EE 535 6 13 Modell an Controller EN 541 6 1 4 Undo und Redo 6 15 Unit Tetanen icdn see essen em eae Als die Views das Laufen lernten son ssnnssseosesesssssssseessessstssteesstssstessressesssses 556 6 2 1 Animationen mit Bl cken u 558 6 2 2 OTANSITION ON AAA a a neau 565 6 2 3 Zur Animation Bitte jeder nur einen Block ue 568 Core Animation E E E EE 570 6 3 R E S E Aender EE 570 6 3 2 Vordefinierte Layer Klassen ENEE 577 6 3 3 Unser Button soll sch ner werden cesssesssssssssseesesesescseseeceeseesenseeesees 580 6 3 4 Spieglein Spieglein an der Wand EEN 582 6 3 5 Der bewegte Layer AANEREN 591 6 3 6 Daumenkino 595 6 3 7 Relativit tstheorie 598 6 3 8 Der View der Layer seine Animation und ihr Liebhaber 602 6 3 9 Die 3 Dimension Scrollviews und gekachelte Layer AANEREN 611 BAL Scrollen und Zoomen n u ur22 ENEE 612 6 4 2 Die Eventverarbeitung see NENNEN 616 64 3 Sch rfeK rvenastn seen nun 622 GAA E EE LEE 625 6 4 5 PDF Dateien
66. dToSelector instantiateViewControllerWith MONIT CT scccsccssscsscscsssstsctuctesatnccsacesicessbacssins 326 385 Ipstarzvartable deeg 66 teg 305 640 Integrierte Entwicklungsumgebung 22 Integrit t Integrit tsbedingung Interface Interface Builder interfaceOrientation Internet Passwords Introspektion iOS Developer Program 22 Enterprise Program seei 23 Provisioning Portal 44 Simulator 897 University Program sssri 23 E LEE et 290 IPA Datei a ea 914 iPhones 280 288 413 424 iPhone Konfigurationsprogramm 948 iPod touch et eg 21 Is Initial View Controller 322 EN EE 180 isEqualT String a e eeiseiiessin 180 ISMS ss nenn lage 977 EE sea 977 ISSECO 975 Issue Navigator 292 886 Ist Beziehung nr ee 63 EE EE 266 iTunes Connect ensen 912 914 ITUNES Store ee 22 913 NES een A 66 J Terre Eege ae 660 Johnson Ralph 169 901 EE 770 UEL nen RER ia 784 K Kamera yeah 25 KAEMA PPr een 878 Kartendarstellung 870 Kategorie 112 249 Kategoriemetbode E 115 Kay Aline seen oti cert lease 58 kCAAnimationDiscrete EE 598 kCAAnimationLineat eee Keep it simple stupid Kennzahlen na Key Value Observing eeee Keychain Ais est Kevframe Animation e e KENE Key Value Coding EE 159 und Dictionary senene e eak 187 Key Value Observing 74 120 361 Konsole Konstruktor Kontextdiagramm Koordina
67. die Methode die Koordinaten und die Gr e des Views in der Variablen theBounds Die Koordinaten des Ziffernblattes liegen relativ zu den Koordinaten des Views deshalb m ssen Sie hier die Bounds und nicht den Frame f r die Berechnung verwenden In der n chsten Zeile sichern Sie den aktuellen Zustand des Grafikkontexts ber die Funktion CGContextSaveGState Damit l sst sich am Ende der Methode genau dieser Zustand sehr einfach ber die Funktion CGContextRestoreGState wiederherstellen Da Sie nicht wissen welche Zeichenoperationen in dem Grafikkontext nach der Aus f hrung Ihrer drawRect Methode noch ausgef hrt werden sollten Sie immer darauf achten den Kontext so zu hinterlassen wie Sie ihn vorgefunden haben Ganz anders als die Toiletten der Deutschen Bahn die man ja so hinterlassen soll wie man sie vor zufinden w nscht Dummerweise hat man nie einen Dampfstrahler dabei wenn man ihn braucht Achten Sie bei der Verwendung dieser beiden Funktionen aber bitte immer darauf ihre Aufrufe zu balancieren das hei t auf jeden CGContextSaveG State Aufruf sollte immer genau ein CGContextRestoreGState Aufruf folgen Die folgenden Zeilen zeichnen dann den Kreis des Ziffernblattes indem die Methode zuerst die F llfarbe als RGBA Werte ber die Funktion CGContextSetRGBAFillColor setzt Die Flie kommawerte f r die Farbkomponenten Rot Gr n und Blau und den Alphawert der die Deckkraft festlegt d rfen dabei zwischen O und 1 liegen Die
68. e Objekte auf der obersten Ebene nennt man auch Top Level Objekte Das ist in Abbildung 3 22 der View mit dem Namen GRAU Diese Objekte nehmen bez glich der Speicherverwaltung zumindest beim automatischen Referenzenz hlen eine Son derstellung ein dazu sp ter mehr 3 2 5 Actions Bislang haben die verwendeten Views nur etwas auf dem Bildschirm dargestellt Viele Views k nnen indes auch Eingaben verarbeiten Im Gegensatz zu den meisten Bildschirmen von Desktop Computern ist bei iOS Geraten das Ausgabeger t ja auch 235 3 Views und Viewcontroller gleichzeitig das Eingabeger t Diese Views haben in der Regel die Klasse UIControl als Oberklasse und werden im Folgenden auch kurz als Controls bezeichnet Typische Controls sind beispielsweise Buttons Schieberegler und Textfelder Neben den Outlets k nnen Sie auch Action Verbindungen herstellen Mit diesen Ver bindungen verkn pfen Sie die von den Controls gesendeten Ereignisse mit einer Methode eines Controllers Wenn Sie eine Action Verbindung zu einem Control erzeugen bekommt das Control ein Zielobjekt und eine Actionmethode bergeben Dieses Vorgehen bezeichnet man auch als Target Action Mechanismus Actionmethoden m ssen eine von drei vorgegebenen Signaturen haben und zumin dest in der Deklaration f r den R ckgabetyp das Makro IBAction verwenden Dieses Makro wird w hrend der bersetzung durch den C Typ void ersetzt Es zeigt dem Interface Builder an dass es sich bei einer
69. eApplication UIApplication sharedApplication theApplication cancelAlllocalNotifications Listing 3 42 Aktualisierung des Alarms Die Methode createAlarm in der Klasse AlarmClockViewController erzeugt eine neue Benachrichtigung 270 3 3 Lokale Benachrichtigungen const NSTimeInterval kSecondsOfDay 60 0 60 0 24 0 void createAlarm UIApplication theApplication UIApplication sharedApplication UlLocalNotification theNotification UILocalNotification alloc init STimeInterval theTime self startTimeOfCurrentDay o clockControl time while theTime lt NSDate timeIntervalSinceReferenceDate theTime kSecondsOfDay 2 0 theApplication cancelAllLocalNotifications theNotification fireDate NSDate dateWithTimeIntervalSinceReferenceDate theTime theNotification timeZone NSTimeZone defaultTimeZone theNotification alertBody Aufwachen theNotification soundName gt UIlLocalNotificationDefaultSoundName theApplication schedulelocalNotification theNotification theNotification release Listing 3 43 Erzeugung einer lokalen Benachrichtigung Zuerst muss die Methode die Alarmzeit in ein NSDate Objekt umwandeln Die Alarm zeit liegt als relative Zeit zum Beginn des aktuellen Tages oder der letzten Mittagszeit vor da das Ziffernblatt nur 12 und nicht 24 Stunden umfasst Die Berechnung erfolgt nun so dass zu der Startzeit des Ta
70. eToFile atomically 783 794 writeToFile atomically encoding error 177 Z Wurzelklasse EE 62 AEN 866 el E 68 WWDR intermediate certificate 48 Zeichenkettenkonstante WWW EECHER 786 811 und Reterenzenz hler 142 Zeichenkodierung a X KCO EE Version 4 2 K l E EE Zeiger DORIQVACION cesssssssssssssssssssssssssesssssssssssssssssssssssee 786 Zeilennummem enesessssnen Ent erde 788 Zeitachse Namensraum susino 789 Zeitraum Path Language nun 814 Zeitverbrauch Wurzelelement 786 Zertifikat Ka 814 zindex Geet EEN 817 Zombie Pr dikat ushnasssnsssinsnahkin 817 zPosition Zugriffsmethode Zur ckbutton Zustand Zyklische Abh ngigkeit 3 Zyklische Referenz 1012
71. edia Die zweite Methode pointWithRadius angle berechnet einen Punkt der vom Mit telpunkt eine gegebene Entfernung hat und um einen gegebenen Winkel gedreht ist Die Winkel werden im Bogenma im Uhrzeigersinn und ausgehend von 12 Uhr gerechnet Einen Winkel w in Grad k nnen Sie ber die Formel wx 180 ins Bogen ma umrechnen CGPoint pointWithRadius CGFloat inRadius angle CGFloat inAngle CGPoint theCenter self midPoint return CGPointMake theCenter x inRadius sin inAngle theCenter y inRadius cos inAngle Listing 3 5 Berechnung eines Punktes ber einen Radius und einen Winkel Das Ziffernblatt stellt einen halben Tag also 12 Stunden dar Somit entsprechen 12 Stunden einem vollen Kreis von 360 und eine Stunde entspricht 360 12 30 oder 30 n 180 n 6 im Bogenma Eine Stunde hat 60 Minuten und damit hat eine Minute einen Winkel von 360 60 6 oder 6 n 180 n 30 3 https secure wikimedia org wikipedia de wiki Bogenmass 212 3 1 Eigene View Klassen in Cocoa Touch im Bogenma F r eine Sekunde gelten nat rlich die gleichen Winkelwerte wie f r Minuten Beispielsweise hat ein Zeiger auf drei Uhr den Winkel 90 beziehungsweise x 2 im Bogenma oder auf 10 Minuten den Winkel 60 beziehungsweise x 3 Die Posi tion eines Uhrzeigers oder eines Strichs auf dem Ziffernblatt kann also durch die Angabe eines Winkels und ein oder mehrere Langenangaben bes
72. eigten View Danach ziehen Sie einen neuen Viewcontroller siehe Abbildung 3 31 auf die Zeichenfl che des Storyboards y Y Ss 00088008 Abbildung 3 31 Die Viewcontroller im Interface Builder Als N chstes legen Sie einen bergang an indem Sie bei gedr ckter rechter Maus taste ein Gummiband vom Button zu dem neuen Viewcontroller ziehen Nachdem Sie in dem schwarzen Dialog den Eintrag performSeguewithIdentifier sender aus gew hlt haben zeigt der Interface Builder zwischen den Viewcontrollern einen grauen Pfeil mit einem Symbol in der Mitte an Im Attributinspektor dieses ber gangs k nnen Sie jetzt festlegen wie der Wechsel erfolgen soll W hlen Sie unter 259 a 3 Views und Viewcontroller STYLE die Option MODAL und unter PRESENTATION den Punkt FORM SHEET aus siehe Abbildung 3 32 Identifier dialog Presentation Form sheer Transition Default H Abbildung 3 32 Ein Ubergang zwischen zwei Viewcontrollern Starten Sie das Projekt im Simulator und klicken Sie den Button Der Simulator graut die wei e Fl che aus und schiebt von unten ein wei es Rechteck auf den Bildschirm Dieses Rechteck ist der neue Viewcontroller den Sie im Storyboard angelegt haben Mit dieser Konfiguration zeigt die App ihn als modalen Dialog an In der Methode prepareForSegue sender k nnen Sie den neu erzeugten Viewcontroller konfigurie ren Der bergang ruft diese Methode bei dem Ursprungsvie
73. en beispielsweise alle Outlets die in dem NIB liegen das das Viewcontroller Objekt enth lt Das sind in Abbildung 3 35 alle Outlets auf der linken Seite 2 Erstellt der Controller die Ressource beim Laden des Views so sollten Sie sie auch erst mit dem View freigegeben Zu den Ressourcen des Ladezyklus geh ren bei spielsweise der View und die wiederherstellbaren Ressourcen die Sie in der Methode viewDidLoad erzeugen Die Freigabe erfolgt entweder automatisch oder in einer der Methoden viewWillUnload viewDidUnload oder didReceiveMemoryWarn ing Alle Outlets auf der rechten Seite von Abbildung 3 35 geh ren hierzu 3 Sie k nnen Ressourcen auch innerhalb des Viewzyklus verwalten also beispiels weise in viewWillAppear anfordern und in viewWillDisappear wieder freigeben Diese drei F lle sind Faustregeln von denen es aber auch durchaus Ausnahmen geben kann Wie dem auch sei Sie sollten die Ressourcen m glichst immer ber Propertys verwalten wie es die Beispielprojekte dieses Buches auch machen Sie k n nen die Ressourcen immer freigeben indem Sie die entsprechende Property auf nil setzen Falls Sie automatisches Referenzenz hlen einsetzen sollten Sie f r alle Out lets auf Nicht Top Level Objekte au er f r die Arrays von Outlet Collections Pro pertys mit dem Speicherverwaltungstyp weak verwenden da der Controller sie dadurch automatisch mit dem Top Level Objekt freigibt Top Level Objekte und die Arrays von Outlet Co
74. en Pfad erneut dem Kontext hinzu und setzen diesen in der Methode drawRect durch Aufruf von CGContextClip als Clipping Pfad Listing 3 6 enth lt die soeben beschriebenen Funktionsaufrufe f r die Kontexteinstellungen CGContextSetRGBStrokeColor theContext 0 25 0 25 0 25 1 0 CGContextSetRGBFillColor theContext 0 25 0 25 0 25 1 0 CGContextSetLineWidth theContext 7 0 CGContextSetLineCap theContext kCGLineCapRound CGContextAddEllipseInRect theContext theBounds CGContextClip theContext Listing 3 6 Setzen von Zeichenattributen im Grafikkontext Die Schleife zum Zeichnen der Einteilungen sieht nun folgenderma en aus CGFloat theRadius CGRectGetWidth theBounds 2 0 for NSInteger i 0 i lt 60 i CGFloat theAngle i M PI 30 0 eine Minute if i 5 0 alle 5 Minuten ein Strich CGFloat theInnerRadius theRadius i 15 0 0 7 0 8 CGPoint theInnerPoint self pointwithRadius theInnerRadius angle theAngle CGPoint theOuterPoint self pointWithRadius theRadius angle theAngle CGContextMoveToPoint theContext theInnerPoint x theInnerPoint y CGContextAddLineToPoint theContext theOuterPoint x theOuterPoint y CGContextStrokePath theContext else CGPoint thePoint self pointWithRadius theRadius 0 95 angle theAngle CGContextAddArc theContext thePoint x thePoint y 3 0 0 0 2 MPI YES CGContextFillPath theContext Listing
75. en Sie alle Gesture Recog nizers des Views abfragen oder auf einmal setzen Mit Xcode 4 2 k nnen Sie die Gesture Recognizer auch direkt ber die Bibliothek siehe Abbildung 3 30 des Inter face Builders zu Ihren Views hinzuf gen indem Sie sie auf die Views ziehen Ae Se Abbildung 3 30 Die Gesture Recognizer in Xcode 4 2 Die Klassen sind in der gleichen Reihenfolge wie die Icons in Abbildung 3 30 aufge f hrt 1 UITapGestureRecognizer erkennt einzelne oder mehrere Ber hrungen des halten den Views Sie k nnen sowohl die notwendige Tap Zahl als auch die Anzahl der beteiligten Finger zur Ausl sung vorgeben 2 UIPinchGestureRecognizer erkennt die Bewegung von zwei Fingern aufeinander zu oder voneinander weg Diese Geste wird meistens zum Heraus beziehungs weise Hereinzoomen verwendet 3 UIRotationGestureRecognizer erkennt die Bewegung von zwei sich umeinander drehenden Fingern wie sie viele Apps f r die Drehung von Bildern eingesetzen 4 UISwipeGestureRecognizer erkennt Wischbewegungen Sie k nnen die Anzahl der beteiligten Finger angeben jedoch damit nur die Richtung und keine Distanzen auswerten 5 UIPanGestureRecognizer erkennt Verschiebe Bewegungen in einem View Sie k n nen damit beispielsweise das Verschieben eines Views innerhalb eines anderen 5 Diese Version war auf das iPad beschr nkt F r alle anderen Ger tetypen gibt es die Gesture Recognizer erst ab iOS 4 0 255 3 Views und Viewcontroller du
76. en Versand einer lokalen Benachrichtigung abgeschlossen Den ken Sie beim Ausprobieren der App aber daran dass sie die Benachrichtigungen nicht anzeigt wenn die App im Vordergrund l uft Sie sollten die App also vor der Versendung ber den Homebutton des Simulators in den Hintergrund schicken oder sie ber Xcode stoppen Die App soll nach einem Neustart nat rlich auch wieder die aktuelle Alarmzeit anzei gen Dazu muss sie vor der Anzeige des Views die letzte Benachrichtigung auslesen und deren Zeit aufdas Clockcontrol und das Label f r die Anzeige der Alarmzeit ber tragen was die Methode updateViews bernimmt void updateViews UIApplication theApplication gt UIApplication sharedApplication UILocalNotification theNotification theApplicatione scheduledlocalNotifications lastObject He f theNotification fireDate compare NSDate date gt gt NSOrderedSame NSTimeInterval theTime theNotification fireDateo timeIntervalSinceReferenceDate self startTimeOfCurrentDay self clockControl time remainder theTime kSecondsOfDay 2 0 self alarmHidden NO d else self alarmHidden YES 272 3 3 Lokale Benachrichtigungen d self updateTimeLabel 1 Listing 3 45 Aktualisierung der Views aus den Benachrichtigungen Sie berechnet aus der absoluten Alarmzeit und der Startzeit des aktuellen Tages die relative Alarmzeit zum aktuellen Tag und bergibt diesen Wert an das C
77. ence Counter Referenzenz hlen Referenzenz hler Referenzzeitpunkt Reflexion Refreshcontrol refreshControl region registerClass forCellReuseldentifiev 480 registerClass forCellWithReuseldentifier 513 registerClass forSupplementaryView OfKind withReuseldentifier registerNib forCellReuseldentifier 479 1005 Index Index registerNib forCellWithReuseldentifier 512 registerNib forSupplementaryView OfKind withReuseldentifier 515 525 registerUndoWithTarget selector object 544 Reiternavigation er Relationship u a Many To Many annann 437 Many To Ohe sonaia eii 437 One TOManNy E 437 F leage ess ae een 142 467 Release Konftgeuration 930 reloadItemsAtIndexPaths oes 526 removeAl Animations e 591 Femove Animation Pork ey sss sssssissesrisseie 591 removeAnnotation uuneeememneennn 876 removeAnnotations eeemen 876 removeCredential forProtectionSpace removeFromParentViewControllet remMoveFroMSuUpervV eW ssss ieseesiirsssreirrseeser removeGestureRecognizer sss 255 removelasgtOblert EE 97 removeObserver EE 407 removeObserver forKeyPath 120 removeObserver name object uee 407 removeOmCompletion EEN removeTarget action s 256 renderInContext sssrinin 583 TEPCACCOUN trees esssrssasisssesesensecesssenvsccasiavenneandseeys 591 repeatDuration 391 replaceCharactersInRange w
78. er darauf ein wie Sie die Verwendung dieser Methoden umgehen k nnen Die Methoden initWithCoder und awakeFromNib kennen Sie ja bereits von den View Klassen Diese Methoden kommen zum Zuge wenn Sie den Viewcontroller in einer NIB Datei oder einem Storyboard erzeugen Sie k nnen einen Viewcontroller auch aus Ihrem Programmcode erzeugen Dazu die nen die Methoden init und initWithNibName bundle Wenn Sie init verwenden m ssen Sie entweder die Methode loadView implementieren oder die NIB Datei des Viewcontrollers muss bis auf die Dateiendung genauso wie die Klasse Ihres Viewcon trollers hei en Wenn sie allerdings einen anderslautenden Namen haben soll sollten Sie stattdessen die Initialisierungsmethode initWithNibName bundle verwenden wobei Sie f r den Bundle Parameter nil verwenden k nnen Das Uberschreiben der Methode awakeFromNib ist in vielen F llen sinnlos da der Viewcontroller zum Zeitpunkt ihres Aufrufs den View noch nicht geladen hat und somit die Outlets noch nicht initialisiert sind Es sind nur die Outlets gesetzt die in 6 Bei ARC geh rt hier nat rlich auch dealloc dazu 264 3 2 Views und Viewcontroller die NIB Datei verweisen die den Viewcontroller erzeugt Ein Beispiel dazu gibt Abbil dung 3 35 die die Hierarchien von zwei fiktiven Viewcontrollern enthalt Dabei ladt das Objekt VIEW CONTROLLER auf der linken Seite seinen View aus dem NIB auf der rechten Seite Der Eigent mer FILE S OWNER der rechte
79. er Zeit die gleiche Bedeutung gt Es gibt sehr viele unterschiedliche Zeitzonen und Kalender wie beispielsweise den buddhistischen gregorianischen und japanischen Kalender Es gibt also sehr viele verschiedene Darstellungen des gleichen Zeitpunktes Es ist einfacher einen Zeit punkt in eine Datumsdarstellung umzuwandeln als eine Datumsdarstellung in eine andere gt Die internen Uhren aller Computer auch die der iPhones und iPads und der Atomuhren stellen die aktuelle Zeit als Differenz zu einem Referenzzeitpunkt dar F r die Erzeugung eines Datumsobjekts braucht der Computer also nicht viel Rechenzeit Um einen Zeitpunkt in eine Datumsdarstellung umzurechnen gibt es zwei Klassen im Foundation Framework gt NSDateFormatter gt NSCalendar Mit NSDateFormatter k nnen Sie zu einem NSDate Objekt eine Zeichenkette erzeugen die das enthaltene Datum darstellt Diese Klasse haben Sie bereits im zweiten Kapitel verwendet und Sie kommt auch im Beispielprojekt Fototagebuch zum Einsatz Mit Objekten der Klasse NSCalendar berechnen Sie basierend auf einer Zeitzone und einer Region die Datumskomponenten zu einem Zeitpunkt und umgekehrt Mit die 217 3 Views und Viewcontroller ser Klasse und ein bisschen Rechnerei k nnen Sie also die Positionen der Uhrzeiger zu einem Zeitpunkt bestimmen Aus diesem Grund enth lt die Klasse eine weitere haltende Property namens calendar vom Typ NSCalendar Mit der Methode compo nents fromDate au
80. er keinen oder genau einen Parameter In diesem Parameter bekommen Sie den Gesture Recognizer ber geben und er sollte dessen Typ haben Die Actionmethode f r den Wecker muss die Position des Fingers auslesen Dazu bietet die Klasse UIGestureRecognizer die Methode locationInView mit der Sie die Fingerposition relativ zu dem Koordina tensystem eines Views berechnen k nnen Die Actionmethode updateClockHand k nnen Sie jetzt folgenderma en implementieren IBAction updateAlarmHand UIGestureRecognizer inRecognizer CGPoint thePoint gt inRecognizer locationInView self clockControl CGFloat theAngle self clockControl angleWithPoint thePoint lockControl angle theAngle self clockControl setNeedsDisplay self alarmHidden NO self updateTimeLabel if inRecognizer state self updateAlarm self ia lowe UIGestureRecognizerStateEnded Listing 3 36 Actionmethode zur Aktualisierung des Alarmzeigers Die Methode updateAlarm am Ende von Listing 3 36 sorgt daf r dass der Wecker zur eingestellten Zeit auch klingelt Wie das genau funktioniert erfahren Sie wie bereits erw hnt in Abschnitt 3 3 Lokale Benachrichtigungen Wenn Sie den Gesture Recognizer durch eine Ber hrung ausl sen ruft er die Actionmethode so lange auf bis Sie den Finger wieder vom Bildschirm nehmen Er registriert also auch alle Finger bewegungen Die App braucht indes die Ausl sung des Alarmtons nicht jedes
81. erneutes Dr cken des Buttons wechselt die Beschriftung wieder auf EIN Der Button hat doch den Zustand highlighted warum erscheint hier nicht auch die Beschriftung KLICK Das liegt daran dass in diesem Fall die Zust nde highlighted und selected gesetzt sind F r diese Zustandskombination haben Sie jedoch keinen Titel festgelegt sodass der Button den Titel des Zustands default verwendet Den Titel f r diese Zustandskombination k nnen Sie wie bereits erw hnt nicht im Interface Builder festlegen sondern m ssen das im Programmcode machen Daf r legen Sie ein Outlet auf den Button an Die Klasse UIViewController besitzt eine wei tere Methode viewDidLoad die Cocoa Touch aufruft nachdem der View geladen wurde In dieser Methode k nnen Sie die Werte f r diese Zustandskombination fest legen Da der Button f r den Zustand selected highlighted den gleichen Titel wie f r den Zustand selected verwenden soll kopiert die Methode den entsprechenden Titel aus dem Button Dadurch k nnen Sie den Titel allein ber den Interface Builder pflegen Durch diese nderung zeigt der Button in der oben beschriebenen Situation jetzt auch den Titel KLICK anstatt EIN an void viewDidLoad super viewDidLoad NSString theTitle self switchButton titleForState UIControlStateHighlighted 245 3 Views und Viewcontroller self switchButton setTitle theTitle forState gt UIControlStateSelected UIControlStateHighlighted Listi
82. fache eigene Oberfl che die sowohl eigene Grafiken auf den Bildschirm zeichnet als auch Nutzereingaben verarbeitet Denn das wichtigste Merkmal eines analogen Weckers ist schlie lich das Ziffernblatt mit den Zeigern Projektinformation Den Quellcode des folgenden Beispiels finden Sie auf der DVD unter Code Apps AlarmClock oder im Github Repository zum Buch im Unterverzeichnis https git hub com Cocoaneheads iPhone tree Auflage_2 Apps AlarmClock Au erdem fin den Sie einige der besprochenen Varianten des Projekts unter Code Apps Clock beziehungsweise https github com Cocoaneheads iPhone tree Auflage_2 Apps Clock 3 1 Eigene View Klassen in Cocoa Touch Und los geht s Legen Sie ein neues iPhone Projekt in Xcode aus der Vorlage SINGLE VIEW APPLICATION an siehe Abbildung 3 1 und geben Sie dem Projekt den Namen AlarmClock Im zweiten Schritt schalten Sie alle Checkboxen aus Der Code in diesem Kapitel ver wendet manuelles Referenzenz hlen um die Speicherverwaltungsregeln zu vertie fen Das Beispielprojekt basiert au erdem auf XIB Dateien da Sie Storyboards erst ab iOS 5 einsetzen k nnen Sie k nnen aber fast alle Beschreibungen f r XIB Dateien auch auf Storyboards bertragen Als Produktnamen und Pr fix f r die Klassenna men geben Sie AlarmClock ein siehe Abbildung 3 2 Danach speichern Sie das Pro jektin einem Verzeichnis Ihrer Wahl ab 199 3 Views und Viewcontroller Choose a template for your new project
83. gers bernehmen Legen Sie zun chst eine neue Klasse ClockCon trol als Unterklasse von UIControl an Das Control erh lt f r die Darstellung der Alarmzeit die Property time mit dem Typ NSTimeInterval der eine Zeitdauer in Sekunden als Flie kommawert enth lt Sie k nnen die Alarmzeit ber die Methode angle in einen Winkel umrechnen und ent sprechend ber die Methode setAngle als Winkelwert setzen Dabei sind 12 Stunden genau 12 x 60 x 60 43200 Sekunden und die entsprechen einem Winkel von 360 und damit k nnen Sie aus der Zeit t ber 2tn 43200 tn 21600 w den Winkel w berechnen Wenn Sie die letzte Gleichung mit 21600 x multiplizieren erhalten Sie die Gleichung t 21600w n um die Zeit aus dem Winkel zu berechnen Diese beiden Gleichungen bilden die Grundlage f r die Implementierung der Methoden angle und setAngle CGFloat angle return self time M PI 21600 0 void setAngle CGFloat inAngle self time 21600 0 inAngle M PI Listing 3 27 Umrechnung der Alarmzeit in einen Winkel und umgekehrt Da auch das Control die Methoden midPoint und pointWithRadius angle ben tigt lagern Sie sie aus der Klasse ClockViewin die Kategorie UIView AlarmClock aus Rufen Sie dazu den Men punkt FILE NEW FILE auf und w hlen Sie die Vorlage OBJEC TIVE C CLASS EXTENSION in der Rubrik 10S COCOA TOUCH aus Wenn Sie im folgenden Dialog AlarmClock unter EXTENSION NAME und UIView unte
84. ges die Alarmzeit hinzugerechnet wird Solange diese Zeit noch kleiner als die aktuelle Zeit ist z hlt die Methode jeweils die Sekun den eines halben Tages hinzu Dabei enth lt die Konstante kSecondsOfDay die Anzahl der Sekunden eines Tages als Zeitintervall Bevor Sie jedoch die neue Alarmzeit setzen m ssen Sie die eventuell noch vorhandenen Benachrichtigungen aus der Warteschlange l schen Als Alarmton verwenden Sie den Systemton f r Benachrich tigungen indem Sie der Property soundName die Konstante UILocalNotificationDe faultSoundName zuweisen Die Methode startTimeOfCurrentDay berechnet den Startzeitpunkt des Tages zu der aktuellen Uhrzeit Dazu verwenden Sie einen Kalender mit dem Sie das aktuelle Datum ohne Uhrzeit in einem NSDateComponents Objekt berechnen lassen Da alle Zeitkomponenten auf O stehen hat dieses Objekt die Uhrzeit 0 00 Uhr Sie brauchen es also nur ber den Kalender wieder in ein NSDate Objekt zur ckrechnen lassen 271 3 Views und Viewcontroller NSTimeInterval startTimeOfCurrentDay NSCalendar theCalendar NSCalendar currentCalendar NSDateComponents theComponents 2 theCalendar components NSYearCalendarUnit SMonthCalendarUnit SDayCalendarUnite fromDate NSDate date NSDate theDate gt theCalendar dateFromComponents theComponents return theDate timeIntervalSinceReferenceDate Listing 3 44 Berechnung des Startzeitpunktes des aktuellen Tages Damit haben Sie d
85. halt Inhalt 2 3 2 4 2 5 2 6 2 7 2 8 3 1 3 2 2 2 7 Vorw rtsdeklarationen w ccccccccccsscssscscsssssscsscsssssscsssscsscsesssssssssssscesessess 118 2 2 8 Kommunikation zwischen den Schichten essesesessssseseresesseresssesereseseeee 119 2 2 9 Delegation entendu Aude EEN AE 125 Speicherverwaltung Propertys und Key Value Coding 231 DerSt ckn an ann seines ins 2 3 2 Der Heap EA AEN 2 3 3 Referenzen z hlen oe 2 3 4 Die Speicherverwaltungsregeln 2 3 5 AUtorelease POO s E 2 3 6 Propertys und Accessoren 2 3 72 ET a 2 3 8 AbschlieBende Bemerkungen ENEE Automatisches Referenzenz hlen ou cccsccccscesssessssceessssssscssssceessessseseees 162 2 4 1 Zur ck in die Zukunft cece ccsceccsessssesssscescsesssscssesssscsssscssssesesssseeesses 163 2 4 2 Weakie und die starken Zeiger ENNEN 164 2 4 3 Autorelease Pools esssesseseseeseesenensennenennennnnennenennnnennennnnenennennenennnnennenennenen 168 2 4 4 Einzelg nger eseesesreeesrseesesseess 168 2 4 5 Migration bestehender Projekte 170 Das Foundation Framework u c ccccccccsccccsescescessscesssesssscsssscsscsssssscsssssssceseeeess 173 2 5 1 Mutables und Immutables wu cesscssssesssscsssscscsesssssssesssscessesess 174 2 5 2 Elementare Klassen wo cccccccccccccsssssscsesscsssscsssscesssessssessssssscssescsscsesssscsseesees 177 2 53 Collections a2 Bids nn 184 Bl cke aunimen EA 2 6 1 R ckruffunktionen Namenskonventionen
86. inen Controller lose an einen View zu koppeln ist die Ver wendung des Target Action Mechanismus ber eigene Unterklassen von UIControl Diese Klasse stellt ebenfalls vier Methoden zur Gestenverarbeitung bereit die den Methoden der Klasse UIResponder sehr hneln Ihre Namen lauten beginTracking WithTouch withEvent continueTrackingWithTouch withEvent und endTracking WithTouch withEvent und sie erhalten jeweils zwei Parameter wovon der erste ein Touchobjekt und der zweite der Event ist Im Gegensatz zu den Responder Methoden erhalten Sie hier also nicht alle Ber hrungen des Bildschirms als direkte Parameter Falls Sie eine Mehrfingergeste implementieren m chten k nnen Sie jedoch alle Ber hrungen ber die Methode allTouches des Events abfragen Au erdem gibt es noch die Methode cancelTrackinghithEvent die das Control analog zu touchesCan celled withEvent beim Abbruch einer Geste aufruft ber die Gestenverarbeitung soll aus der Uhr ein Wecker entstehen Bei einem analo gen Wecker gibt es neben den Zeigern f r die Zeitanzeige einen weiteren Zeiger f r die Alarmzeit In der Wecker App soll der Nutzer diesen Zeiger durch Ber hrung und 248 3 2 Views und Viewcontroller Bewegung mit dem Finger einstellen k nnen Das Control muss also eine Drehbewe gung mit einem Finger auf dem Bildschirm erkennen Diese Bewegung ahnelt dem Wahlen auf einem Telefon mit W hlscheibe Das Control soll dabei auch die Darstel lung des Alarmzei
87. ingWithContentsOfURL encoding BROT een 42 822 stringWithContentsOfURL usedEncoding ETOT ie i A aia 823 stringWithFormat strokeColor eiieeii STONE aussen ri SUDKLASS Cl sie nee een 1008 GIE E sublayerTransform Subskriptionsoperator substringFromIndex substringToIndex substringWithRange superlayer Superview supportedInterfaceOrientations Symbolnavigator synchronize T tabBar didSelectItem tabBarController didSelectViewCon HONET anaE OA 374 tabBarController shouldSelectView Controller isses 374 tabBarController willEndCustomizingView Controllers changed tabBarltem Tabbarnavigation Tableview statisch tableView cellForRowAt IndexPath uneeesie 473 478 876 tableView commitEditingStyle for target stop hook list Target Action Mechanismus Target Einstellungen EE Tastatur naar Tastaturkurzbefehle 10010000000s0sss105111110112 Tastenbelesun gi ged ei aetenktOrzel geseet deed Team Provisioning Profile Teresa Tempor re Datei Testdaten alas Testgetriebene Softwareentwicklung 555 Testmeth der uur nnae ann Test Methodik un 2n as Testobjekt al unser nenn Testtarget anlegen textViewDidEndEditing e 448 textViewShouldBeginEditing 448 Thread eunin re AEA 152 Threat Modeling THOS I ZG ann Time Machine Time Profiller ee ala THIN COTES OE nes DUTTA GY a
88. ions u 879 openMapsWithltems launchOptions 880 er use 46 ODER tee 881 Operation Quevle nu 834 OPSANIZEL at 293 910 960 GIS SIT nn 416 orthogonal eseo ra eaa OA RERA 255 Ortsa ke cess cadsssssessacsssssicsscsnebacadiscaasncobssadesasignncess 878 BE EE 38 227 SA TEPID UT Gear ak 230 Collection csssisassscsssadsesssicssssavisnscvasvesrusessstes 227 231 Property Outlet Collection Speicherverwaltung u 267 1004 P DEE EEIE ere 300 Dageviewcontroller 381 pageViewController spineLocationFor InterfaceOrientation 0 381 385 pageViewController viewController AfterViewController ou 384 pageViewController viewController BeforeViewController Een 384 parser didEndElement namespaceURI Qualified NAME EE 805 parser didStartElement namespaceURI Pentesting perfomSelector withObject afterDelay 466 Pelform en ea e 333 Pertformance Leak EE 652 performSegueWithIdentifier sender 259 261 performSelector withObject und automatisches Referenzenz hlen 806 performSelector withObject afterDelay 837 performSelectorInBackground with Object ans ri T 152 467 performSelectorOnMainThread withObject waitUntilDone Persistenz Perspektivische Darstellung PHP aktivieren Pinchgeste PKI Umgebung Plakette pointInside withEvent N POlineu mn E DOP suse ea nee 136 POP OVER Es ae 329 360 Controller 456 Viewcontroller EE 364 popToRootViewCont
89. ithString 181 Replication Layer een 589 Repudiationes anne 689 694 RE QUES Tonnan riir Meere 774 requestWithURL een 825 requestWithURL cachePolicy time outInterval 825 Requirements 981 EE 256 Ee eet 247 respondsToselector 71 341 397 941 Response PoOlicy EE 988 EE 266 Ressourcenverzeichnis eee 471 Restriktion eiert 419 TETAI ie aR nS A EE 142 154 Retain Zykl sin ncuenseeenleseee 643 Reti na Dis EE 280 RFC 3986 RGBA Wert Richtlinien Bichtungsvektor EE 609 1006 Root Certificate Authority 48 ROOECA EE 48 Rootviewcontroller des Navigationcontrollers rootViewController Rotation an Houptochsen uss is 610 Rotationsachse runActionForKey object arguments Runloop SAX Ereignis Characters End Document End Element Start Document scheduledLocalNotifications 270 scheduledTimerWithTimelnterval target selector userInfo repeats occ 224 scheduleLocalNotification 270 Schema Schema Auswahl Schicht Schl ssel Schl sselbund Schl sseleigenschaft Schl sselmanagement ss sssseissserrsserrsssersssenes 988 Schnellhilfe Schnittstelle Schwache Referenz und iOS 4 Schwachstellenanalyse SCNetworkReachabilityFlags SCNetworkReachabilityGetFlags SCNetworkReachabilityRef SCNetworkReachabilitySetCallback SCNetworkReachabiltyCreateWithName 867 Screenshot are 582 SCLONTOPOINt Henning 579
90. klarationen zum Projekt hinzu Dabei liegen die Headerdateien immer unterhalb eines virtuellen Ordners mit dem Namen des Frame works In der Regel hat jedes Framework von Apple eine Headerdatei mit dem Namen des Frameworks ber diese Datei k nnen Sie alle Header des Frameworks auf einmal einbinden Da Sie die Audio Toolbox im Application Delegate verwenden m chten m ssen Sie dort den Header dieses Frameworks ber die Direktive import lt AudioToolbox AudioToolbox h gt einbinden Das Abspielen des Tons erfolgt in zwei Schritten Zuerst muss ihn die App aus der Datei laden Sie erhalten dabei einen Verweis auf den Ton mit dem Sie ihn beliebig oft abspielen k nnen Wenn Sie ihn nicht mehr ben tigen sollten Sie den Ton ber diesen Verweis auch wieder freigeben Der Verweis auf den Ton ist eine vorzeichenlose Zahl die das Application Delegate ber die Property soundId verwaltet Das Delegate soll den Ton jedoch nur einmal laden und das nur dann wenn es ihn braucht Dies erfolgt in dem Lazy Getter soundId Diese Methode pr ft zuerst ob sie den Ton bereits geladen hat und macht dies gegebenenfalls Lazy Getter Lazy Getter sind eine einfache und effektive M glichkeit f r den sparsamen Um gang mit Ressourcen Sie haben bereits ein weiteres Beispiel daf r kennengelernt Die Property view der Klasse UIViewController l dt den View erst wenn das Pro gramm das erste Mal darauf zugreift Das ist in der Regel kurz vor dessen A
91. ktionalitat zum Erneuern der Zellinhalte bereit UISegmentedControl selectedSegmentIndex Stellt mehrere Buttons nebenein ander dar von denen der Nutzer aber nur einen ausw hlen kann Radiobutton Leiste UISlider value Erlaubt die nahezu stufenlose Auswahl eines Wertes Uber einen Schieberegler UISwitch Ein Schalter mit zwei stabilen Zustanden UIStepper value Erlaubt die Auswahl eines Wertes uber einen Plus und einen Minus knopf Dieses Control gibt es seit iOS 5 Tabelle 3 1 Controls die das Ereignis Value Changed senden Ereignisse f r Gesten Ein wichtiger Erfolgsfaktor des iPhones ist dessen Gestensteuerung Es gibt in iOS zwei Klassen von Gesten Der Nutzer kann ber Ber hrungsgesten Eingaben auf dem Bildschirm machen Das k nnen einfache Fingerdr cke oder komplexere Mehrfin gerbewegungen auf dem Touchscreen sein Dieser Abschnitt besch ftigt sich aus 239 3 Views und Viewcontroller schlie lich mit dieser Gestenklasse Eine weitere grunds tzliche M glichkeit Eingaben vorzunehmen sind Bewegungs und Sch ttelgesten die wir in Kapitel 6 Models Layer Animationen behandeln Ber hrungsgesten l sen eine Reihe von unterschiedlichen Ereignissen aus Eine Ber hrungsgeste kann sich ber mehrere Views erstrecken Die Ereignisse werden hingegen immer an das Control gesendet das das erste Ereignis einer Geste empfan gen hat gt UIControlEventTouchDown leitet alle Gesten ein und
92. len zu k nnen Eine Ber hrung des Ziffern blatts die l nger als vier Zehntelsekunden dauert schaltet den Alarmzeiger ein und setzt ihn an die Position des Fingers Legen Sie einen Longpress Recognizer an indem Sie das entsprechende Objekt aus der Bibliothek auf das Clockview Objekt in der Baum ansicht ziehen Das Ein und Ausschalten des Alarmzeigers und des Labels erfolgt ber die Property alarmHidden die auch die Sichtbarkeit dieser Views steuert Sie ndert au erdem noch den Zustand eines Schalters ber das Outlet alarmSwitch mit dem der Nutzer den Alarm explizit ein oder ausschalten kann BOOL alarmHidden return self clockControl hidden void setAlarmHidden BOOL inAlarmHidden self alarmSwitch on inAlarmHidden self clockControl hidden inAlarmHidden self timeLabel hidden inAlarmHidden Listing 3 35 Sichtbarkeit der Alarmanzeige steuern 256 3 2 Views und Viewcontroller Die Zuordnung ist wichtig Der Gesture Recognizer funktioniert nicht richtig wenn Sie ihn nicht zu dem View sondern zu dem Control hinzuf gen Sie sollen ihn ja auch bei ausgeschaltetem Alarm benutzen k nnen Da Sie in diesem Zustand allerdings das Control versteckt haben beachtet Cocoa Touch dann auch den Recognizer nicht Das Ziffernblatt ist hingegen immer sichtbar Sie k nnen die Zuordnung des Recognizers brigens in dessen Verbindungsinspektor berpr fen Die Actionmethode eines Gesture Recognizers hat entwed
93. liotbhek EE 889 Megginson David 795 Me hre intrags owua caseuwanvwaccamannnraad 375 Mehrfachtap auswerten s sssissesiissserrsserrssserres 241 Memory Mapping 184 Meggie eet EA 187 1002 Mercurial es do O EE Message Passing Messgr e Messinstrument Methode abstrakte auslagern Delegate erforderliche optionale berschreiben Methodenimplementierung Microsoft SDL Pro Network SDL Threat Modeling Tool Threat Analysis amp Modeling MIME Typ nenen minimuminteritemSpacing minimumLineSpacing minimum Zoom Scale MKAnnotation MKAnnotationView MKCoordinateRegion ss sssessesssseserrresesseriressse MKCoordinateSpan eeeeee MKLaunchOptionsDirectionsModeKey 880 MKMapltem MKMapPointForCoordinate MKMapRect MKMapRectUnion MKMapView MKPinAnnotationView MKPlacemark MKUserLocation Mobilfunk Modaler Dialog modallnPopover modalTransitionStyle modalViewController Model View Controller Modultest Mountain Uon a nan A R i Multipart Datenformat Multithreading mutableCopy Mutables Architekturmuster Muster N Nachricht u aese 60 64 Nachichtenaustausch 58 64 Namensraumdeklaration in XML 790 NAVIGATION BAL aisesssccssnccssasceshedssostsarstersndessncosiessanstes 346 Navigationcontroller ss sssssissseissserrsssrisssrrsssenee 333 und Autorotationsverhalten 415 navigationController s 3
94. lisie rung durchlaufen haben 3 1 4 Aktualisierung der Zeitanzeige Als N chstes soll die Zeitanzeige kontinuierlich aktualisiert werden Diese Aufgabe kann entweder der View selbst oder der Viewcontroller bernehmen Da jedoch jedes Objekt der Klasse ClockView diese Aufgabe erf llen sollte wird der daf r n tige Code in der View Klasse angesiedelt F r die Aktualisierung der Zeitanzeige m ssen Sie nur in regelm igen Abst nden den Wert der Property time aktualisieren Wenn Sie eine kurze Aufgabe wiederholt ausf hren m chten k nnen Sie daf r die Klasse NSTimer verwenden Die Klasse ClockView erh lt dazu eine weitere Property von diesem Typ und jeweils eine Methode zum Starten und zum Stoppen der Aktualisierung Anonyme Kategorie Die Klasse verwendet die Property timer nur intern Eine Zugriffsm glichkeit von au en ist also nicht notwendig Das l sst sich durch eine anonyme Kategorie ver meiden Bei einer anonymen Kategorie geben Sie bei der Deklaration zwischen den runden Klammern keinen Namen an und als Implementierungsteil verwenden Sie den der Klasse 222 3 1 Eigene View Klassen in Cocoa Touch In der Regel deklarieren Sie die anonyme Kategorie einer Klasse in deren Implemen tierungsdatei Sie k nnen die Timer Property also in der anonymen Kategorie dekla rieren da sie f r andere Klassen nicht sichtbar sein soll interface ClockVien property nonatomic retain NSTimer timer end implementa
95. llections m ssen Sie hingegen immer halten indem Sie den Speicherverwaltungstyp strong beziehungsweise retain verwenden Au erdem m ssen Sie f r diese Objekte entscheiden wann der Viewcontroller sie freigeben soll Hierbei sind insbesondere die Ressourcen des Lade zyklus interessant Vor der iOS Version 6 hat Apple empfohlen sie in der Methode viewDidUnload freizugeben Diese Methode ist seit iOS 6 indes veraltet und Sie soll ten sie stattdessen in der Methode didReceiveMemoryWarning freigeben wenn die Methode der Oberklasse den View des Controllers freigegeben hat Der Code sollte also so aussehen void didReceiveMemoryWarning super didReceiveMemoryWarning if self isViewLoaded Freigabe aller wiederherstellbaren Ressourcen die 267 3 Views und Viewcontroller der Controller in viewDidLoad erzeugt oder l dt Listing 3 41 Ressourcenfreigabe unter iOS 6 Da es die Methode didReceiveMemoryWarning jedoch schon seit iOS 2 gibt k nnen Sie das Vorgehen aus Listing 3 41 auch schon f r die lteren Betriebssystemversionen einsetzen Dabei ist die berpr fung allerdings wichtig Wenn die App den View des Viewcontrollers w hrend einer Speicherwarnung anzeigt erh lt der Controller zwar die Warnung aber gibt dennoch nicht seinen View frei Tipp Die Methode didReceiveMemoryWarning sollten Sie immer so implementieren dass Cocoa Touch sie mehrmals aufrufen kann Sie k nnen die korrekte Funktionsweise
96. loads fim ik m AlarmClo ntroller m rang B en Iproj P E Bilder D fm main m ffentlich fit Lihrane bd U Group AlarmClock E Targets M A AlarmClock Gane D Abbildung 3 5 Anlegen der neuen Klasse in der Gruppe AlarmClock Nach dem Anlegen der Dateien zeigt ein Blick in den Quelltext der Headerdatei der neuen Klasse dass Xcode eine Subklasse von UIView erstellt hat import lt UIKit UIKit h gt interface ClockView UIView end Listing 3 1 Header Datei der Klasse ClockView Bevor Sie jedoch die Zeichenlogik fiir das Ziffernblatt implementieren erstellen Sie die Oberfl che der App Dann k nnen Sie das Programm immer wieder starten und sich so die Auswirkungen Ihrer nderungen ansehen Um die neue Viewklasse benutzen zu k nnen m ssen Sie einen View in der XIB Datei des Viewcontrollers anlegen die Xcode beim Anlegen des Projekts erzeugt hat W hlen Sie im Projektnavigator die Datei AlarmClockViewController xib aus Xcode ffnet dann den Interface Builder und zeigt den enthaltenen View an Um das Ziffern 202 3 1 Eigene View Klassen in Cocoa Touch blatt in diesen View einzuf gen ziehen Sie einen UI View aus der Objektbibliothek auf den bereits vorhandenen View siehe Abbildung 3 6 ANNO AlarmClock AlarmClockViewController xib oO m AlarmCiock iPhone 5 0 Simulator Xcode Elaa Ca Soa S e AlarmClock w E 1 target 105 50x 5 0 z Cj Ala
97. lockcontrol Au erdem sorgt sie durch einen Aufruf von updateTimeLabel daf r dass der Control ler auch die Textanzeige aktualisiert Um diese Aktualisierung zu aktivieren m ssen Sie die Methode noch aus der Methode vienhillAppear aus aufrufen void viewwillAppear BOOL inAnimate id viewWillApp OOL inAni d super vienwillAppear inAnimated self updateViews Listing 3 46 Aufruf der Aktualisierungsmethode 3 3 2 Benachrichtigungen verarbeiten Durch eine lokale Benachrichtigung k nnen Sie folgende Ereignisse ausl sen Sie k nnen gt eine Nachricht anzeigen lassen gt einen Klang mit einer maximalen Lange von 30 Sekunden abspielen und gt die Zahlin dem Badge das am Icon der Applikation im Springboard erscheint auf einen festen Wert setzen Die lokale Benachrichtigung kann indes nicht Ihre Applikation automatisch in den Vordergrund bringen Entweder ist sie bereits im Vordergrund oder abh ngig von der Konfiguration erscheinen eine Nachricht und die Badgenummer und ert nt der Klang Um die App zu aktivieren muss der Nutzer den Button ANZEIGEN in der Alert box bet tigen beziehungsweise das Banner antippen Wenn die App im Vordergrund l uft informiert Cocoa Touch Sie direkt ber das Auf treten einer lokalen Benachrichtigung Das geschieht ber die Methode application didReceivelocalNotification im Application Delegate Das Betriebssystem ruft diese Methode auch auf wenn die App nicht oder im Hintergr
98. m Interface Builder die m glichen Objekte f r die Zuwei sung auf die Klasse ClockView ein Durch diesen Verbindungstyp k nnen Sie jetzt zum Starten und Stoppen der Uhren eine Schleife verwenden void vienDidAppear BOOL inAnimated super viewDidAppear inAnimated for ClockView theView in self clockViews theView startAnimation void viewwillDisappear BOOL inAnimated for ClockView theView in self clockViews theView stopAnimation super viewWillDisappear inAnimated Listing 3 19 Starten und Stoppen der Uhren ber eine Outlet Collection Der Verbindungsinspektor zeigt Ihnen die Outlet Collections des Objekts in einer eigenen Rubrik an siehe Abbildung 3 20 und Sie k nnen einzelne Verbindungen durch einen Klick auf das x Kreuzchen vor der Verbindung wieder l sen Y Referencing Outlets New Referencing Outlet Referencing Outlet Collections New Referencing Outlet Collection Abbildung 3 20 Outlet Collections im Verbindungsinspektor 232 3 2 Views und Viewcontroller Achtung Outlet Collections verwenden zwar Arrays Sie k nnen jedoch die Reihenfolge der Elemente in dem Array nicht durch den Interface Builder festlegen 3 2 3 Containerviews Wenn Sie mit Ihrer App eine ltere iOS Version als 4 unterst tzen m chten oder die Reihenfolge der Views wichtig ist k nnen Sie statt der Outlet Collection auch einen View als Container verwenden Sie legen d
99. merkung Standard 57 x 57 Pixel Notwendig f r iPhone und iPod touch iPhone Retina 114 x 114 Pixel Optional f r iPhone und iPod touch mit Retina Display Tabelle 3 3 Formate f r das App Icon 278 impott include EE 180 implementation sss ssssesisssrrssersssrrrsrrrssseresser 67 ue dg 66 HEEN e ne ee ee 160 NUN sign 160 optional u 117 132 DO DEEN ere 89 lege EE 117 Vorw rtsdeblorotion 119 __strong __unsafe_unretained EE 167 __weak Abh ngigkeit Ableiten Abstrakte Klasse Abstraktion accelerometer didAccelerate AccelerometerGraph E Accept Ranges 817 actionForKey actionForLayer forKey Actionmethode actions Activityindicator Adams Douglas addAnimation forKey addAnnotation anasinin 876 addAnnotations addChildViewController addConstraint addConstraints addGestureRecognizer 603 addObserver forKeyPath options Contest Seet addSublayer adjustsImageWhenHighlighted 242 afconvert Kommandozeilenprogramm 274 Affine Transformation 560 Aktive Applikation Alertbox Alertview alertViewStyle allCredentials al al al Allocations allTouches 642 EE Anfrage O vnchrone EE 820 synchrone Angemessenheit E te E eiia animatesDrop
100. mplementierung Sie in Listing 3 34 finden Sobald Sie den Alarmzeiger bewegen sendet das Control ja dieses Ereignis Die Methode schreibt die aktuelle Weckzeit in das Label Die Variable theTime enth lt dabei die Alarmzeit in Minuten Die Stunden und Minuten f r die Anzeige berechnen Sie daraus durch eine Division durch 60 wobei der Divisionsrest der Minutenanteil ist IBAction updateTimelabel NSInteger theTime round self clockControl time 60 0 NSInteger theMinutes theTime 60 NSInteger theHours theTime 60 self timeLabel text NSString stringwithFormat d 02d theHours theMinutes Listing 3 34 Erzeugung einer Zeichenkette aus einer Alarmzeit Wenn Sie den Alarmzeiger in der App bewegen k nnen Sie sehen dass der Controller auch die angezeigte Alarmzeit kontinuierlich aktualisiert Dem Wecker fehlt jetztnur noch die Weckfunktion also das Klingeln Au erdem muss der Viewcontroller beim Loslassen des Zeigers den Alarm konfigurieren Diese beiden Themen behandelt Abschnitt 3 3 und die Implementierung der Weckfunktion geschieht ber die Actionmethode updateAlarm die Sie ber das Ereignis Touch Up Inside mit dem Con trol verbinden Mehrere Ereignistypen behandeln Der Viewcontroller verarbeitet also zwei unterschiedliche Ereignistypen des Con trols Das ist gerade bei Controls die kontinuierliche Werte liefern sinnvoll Der Ereignistyp Value Changed dient zur Aktualisierung des Views und somit zu
101. n Methoden k nnen Sie nun die Gestenverabeitung implementieren Der Inhalt der 251 3 Views und Viewcontroller drei Methoden beginTrackingWithTouch withEvent continueTrackingWithTouch withEvent und endTrackingWithTouch withEvent ist dabei fast gleich sodass das Control f r diesen Code sinnvollerweise die Hilfsmethode updateAngleWithTouch bereitstellt Sie ermitteln jeweils aus der Fingerposition den Punkt im Control und rechnen diesen tiber die Methode angleWithPoint in den entsprechenden Winkel um Diesen Winkel tibergeben Sie an die Methode setAngle die daraus die entspre chende Weckzeit berechnet Nach der Neuberechnung m ssen die Methoden noch den Zeiger f r die Weckzeit durch einen Aufruf von setNeedsDisplay neu zeichnen lassen Die letzte Anweisung der Methode versendet schlie lich das Value Changed Ereignis Sie ruft also bei den entsprechenden Targets des Controls die jeweilige Actionmethode auf void updateAngleWithTouch UITouch inTouch CGPoint thePoint inTouch locationInView self self angle self angleWithPoint thePoint self setNeedsDisplay self sendActionsForControlEvents gt UIControlEventValueChanged Listing 3 31 Aktualisierung der Daten in den Tracking Methoden Die Methode cancelTrackingwithEvent sollte den Ausgangszustand des Controls bei Gestenabbruch wiederherstellen Dazu muss es den aktuellen Winkel zu Beginn der Gestenverarbeitung speichern und in dieser Methode wieder an
102. n NIB Datei ist ein Platzhal sel ter f r das Viewcontroller Objekt aus dem linken NIB Der Viewcontroller verlinkt also ber Outlets sowohl auf Objekte aus dem linken als auch aus dem rechten NIB Wenn Cocoa Touch nun die Methode awakeFromNib des Viewcontrollers aufruft bestehen nur die Outlets zu den beiden Objekten NAVIGATION CONTROLLER und OBJECT aus dem linken NIB da er das rechte NIB ja noch nicht geladen hat Die Ver bindung zum View und die Outlets zum Label und dem Imageview hat Cocoa Touch hingegen noch nicht hergestellt Diese Verbindungen kommen erst durch den Auf ruf der loadView Methode zustande Ns Placeholders is Placeholders File s Owner First Responder File s Owner First Responder J outlet ES Objects Objects EA View vi View View Controller Label Label gt Navigation Controller Image View Object Button outlet outlet Abbildung 3 35 Outlets zwischen XIB Dateien Regeln f r Outlets Auf das Objekt eines Outlets eines Viewcontrollers k nnen Sie gt fr hestens in viewDidLoad zugreifen wenn Sie das Outlet vom F LE s OWNER zum Objekt gezogen haben gt schon in awakeFromNib zugreifen wenn die Verbindung von dem Viewcontroller in der Rubrik OBJECTS ausgeht Der Viewcontroller l dt den View beim ersten Zugriff auf die Property view Das ge schieht vor der ersten Anzeige des Views Sie k nnen
103. n legt Ihnen Cocoa Touch ein schn des NSObject an brigens k nnen Sie in diesen Objekten auch Outlets und Actionmethoden anlegen die Sie mit Ihren Views verkn pfen k nnen Sie haben bereits einige Methoden kennengelernt die Cocoa Touch zu bestimmten Zeitpunkten im Leben eines Viewcontrollers aufruft Wenn Sie beispielsweise die Methode viewDidAppear berschreiben k nnen Sie eigenen Programmcode ausf h ren unmittelbar nachdem Ihre App den View des Viewcontrollers angezeigt hat Cocoa Touch benachrichtigt Sie also ber ein bestimmtes Ereignis das Ihren View controller betrifft In Abbildung 3 34 ist der komplette Lebenszyklus eines Viewcon trollers anhand seiner Initialisierungs und Benachrichtigungsmethoden sowie der Property view dargestellt Bis auf die Property view d rfen Sie allerdings keine dieser Methoden direkt aufrufen Sie d rfen sie nur berschreiben 262 3 2 Views und Viewcontroller initWithCoder init initWithNibName bundle Y awakeFromNib E viewWillDisappear er view gt viewWillAppear 4 loadView l Y i viewDidAppear l View wurde geladen I e o e View wird angezeigt e i viewDidLoad l l I i E viewWillUnload EI viewDidDisappear Y viewDidUnload Anzeigezyklus
104. ng 3 26 Initialisierung eines Buttons nach dem Laden des Views 3 2 8 Direkte Gestenverarbeitung Wie bereits erw hnt k nnen Sie den Target Action Mechanismus f r die Gestenver arbeitung einsetzen Dieses Vorgehen ist indes recht aufwendig wenn Sie eine Geste wiederverwenden m chten Cocoa Touch bietet noch andere M glichkeiten um Gesten zu verarbeiten Damit ein View die Touch Ereignisse empf ngt m ssen Sie immer dessen Property userInteractionEnabled setzen Cocoa Touch durchsucht in der View Hierarchie nur diese Views und sendet die Ereignisse an den tiefsten View unter dem der Ber h rungspunkt des Fingers liegt Mit der tiefste View ist gemeint dass es in diesem View keinen weiteren Subview an der Fingerposition mit gesetzter Property user InteractionEnabled gibt Der View muss auch wollen Sie k nnen ber userInteractionEnabled die Touchverarbeitung komplett aus schalten Wenn Sie diesen Property Wert also auf NO setzen reagieren weder der View noch dessen Subviews mehr auf Ber hrungen Dabei ist es egal ob Sie ein Control verwenden oder die Touches direkt oder ber eine andere Methodik aus werten Bei userInteractionEnabled NO ignoriert der View Ihre Ber hrungen m gen Sie ihn auch noch so z rtlich streicheln Die Klasse UIView stellt zwei Methoden bereit um den Subview zu ermitteln der die Gesten verarbeitet Die Methode hitTest withEvent bestimmt zu einem Punkt den Subview der die Gestenverarbeit
105. nner am oberen Bildschirmrand 268 3 3 Lokale Benachrichtigungen dar Sie k nnen in der App Einstellungen unter MITTEILUNGEN ALARMCLOCK HINWEISSTIL aber HINWEISE ausw hlen um die Nachrichten in Alertboxen anzeigen zu lassen Eine Vor Auswahl dieses Anzeigestils ber die App ist dagegen leider nicht m glich sel Abbildung 3 36 App Icons mit Badges Nachrichten an aktive Apps Die Nachricht erscheint dagegen nicht wenn die App im Vordergrund lauft Statt dessen ruft Cocoa Touch eine Methode des Applicationd Delegates auf In diesem Fall k nnen Sie also selbst entscheiden was Sie mit der Nachricht anfangen wollen TTT NEEN Wecker Aufwachen SchlieBen Anzeigen Abbildung 3 37 Anzeige einer lokalen Benachrichtigung in einer Alertbox CA Wecker 49 Aufwachen Abbildung 3 38 und in einem Banner Sie definieren eine neue Benachrichtigung indem Sie ein Objekt der Klasse UILocal Notification erzeugen und den Ausl sezeitpunkt setzen Au erdem k nnen Sie 7 Nach der Lokalisierung der App in Abschnitt Sprachkursus f r die App hei t dieser Punkt Wecker 269 3 Views und Viewcontroller einen Nachrichtentitel und text angeben wenn Sie eine Alertbox anzeigen lassen wollen F r den Benachrichtigungston und das Badge k nnen Sie den Namen des Tons beziehungsweise den Wert bergeben Die neue Benachrichtigung f gen Sie danach in die Warteschlange f r lokale Benachrichtigungen ein auf die
106. nzeige Lazy Getter haben meist den gleichen einfachen Aufbau MyClass myObject if myObject nil myObject Speicherverwaltung nicht vergessen return myObject 276 3 3 Lokale Benachrichtigungen Die Methode playSound spielt den Ton ab NSNumber soundId if soundId nil NSURL theURL NSBundle mainBundle URLForResource ringtone withExtension caf SystemSoundID theld if AudioServicesCreateSystemSoundID CFURLRef theURL amp theld AudioServicesNoError self soundId NSNumber numberWithUnsignedInt theld return soundId void playSound NSNumber theId self soundId if theld AudioServicesPlaySystemSound theId unsignedIntValue Listing 3 48 Laden und Abspielen eines Tons Listing 3 48 verwendet f r die Property soundId anstatt des Typs NSUInteger die Klasse NSNumber Das hat den Vorteil dass Sie ber den Property Wert nil den Zustand des nicht geladenen Tons abbilden k nnen In der Methode dealloc m ssen Sie den Ton auch wieder freigeben damit kein Speicherleck entsteht Das k nnen Sie durch den folgenden Setter erreichen void setSoundId NSNumber inSoundId if soundId inSoundId if soundId nil AudioServicesDisposeSystemSoundID soundId unsignedIntValue soundId release 277 3 Views und Viewcontroller soundId inSoundId retain Listing 3 49 Freigabe des Alarmtons im Sette
107. oller immer nur die Uhr startet auf die er ber das Outlet zugreifen kann Sie k nnen jetzt f r jede Uhr auch ein eigenes Outlet mit den entsprechenden Start und Stoppanweisungen anlegen um die Uhren analog zu starten und zu stoppen Das ist jedoch sehr unelegant und sieht nicht sehr sch n aus da Sie mehrmals die gleichen Anweisungen schreiben m ssen F r das mehrfache Ausf hren der glei chen Anweisung gibt es doch schlie lich Schleifen Seit iOS 4 k nnen Sie Outlet Collections verwenden um mehrere Objekte aufeinmal zu verbinden Sie erzeugen sie hnlich wie Outlets indem Sie eine Verbindung von einem Objekt im Interface Builder in die Headerdatei des Controllers ziehen Lassen Sie die Maustaste los und w hlen Sie im Pop Over Dialog unter CONNECTION den 231 3 Views und Viewcontroller Punkt OUTLET COLLECTION aus In das Textfeld schreiben Sie clockViews Nach einem Klick auf den CONNECT Button legt Xcode eine Property mit dem Typ NSArray an und f gt eine Markierung IBOutletCollection ClockView vor der Deklaration des Typs ein Die Deklaration in der Headerdatei sieht so aus property retain nonatomic IBOutletCollection ClockView NSArray clockViens Au erdem hat Xcode die Implementierungsdatei ver ndert Sie k nnen jetzt der Outlet Collection beliebig viele Clockviews zuweisen indem Sie Gummib nder von den Views zu dieser Property Deklaration ziehen Der Makroparameter ClockViewin der Deklaration schr nkt i
108. orotate shouldAutorotateTolnterface shouldProcessNamespaces shouldReportNamespacePrefixes Sicherer Entwicklungszyklus Sicherheit der Ausstattung Sicherheitsanforderungen Sicherheitskonzept E Sicherheitsl cke Sicherheitsmetrik Sicherheits berpr fung SIGABRT Simple API for XML Simula Simulated Metrics Singleton und Referenzenz hler sizeThatFits sizeWithFont Skalierungsfaktor Smalltalk 80 Snapshot automatischer exportieren Snippet Software Development Kit Software Tastatur sortedArrayUsingSelector soundName Index Index Speicherverwaltungsregeln 143 645 und Outlet Attribute ee 230 Speicherzugriffsfehler eee 638 Spiegelung un nsssneschaensns 561 582 Spiralmodell 975 Splitviewcontroller s sssssssssrssserrssesrssssrrssserrsseeee 362 splttNiewController 367 splitViewController popoverController willDresentViewC onttroller ue 363 splitViewController willHideView Controller withBarButtonItem for StEaCkktape EENS 305 Standardrestriktion 420 421 Standardeprache EE 283 standardUserDefaults sss0s0s0s11111111111011000000 355 startAnimatin uememeensene Startbildschirm DCH Ee e GE EDD EE El stopAnimating Storyboard EE StOTYVDOS Te asou S TGDN SAAR STRIDES 2m sn stringByAddingPercentEscapes stringFromDate EEN 84 str
109. p f ngt jedoch nur Ereignisse f r die Gesten in dem gekennzeichneten ber hrungs empfindlichen Bereich Die anderen Ber hrungen erh lt in diesem Beispiel der Hauptview Hauptview Superview ber hrungsem pfindlicher Bereich Abbildung 3 27 Ber hrungsempfindlicher Bereich eines Subviews Gestenverarbeitung ber Responder Die Klasse UIResponder ist die direkte Oberklasse von UIView und UIViewController Sie stellt mehrere Methoden zur Auswertung von Gesten bereit Die Methoden f r die Ber hrungsgesten haben jeweils zwei Parameter und liefern void zur ck Der erste Parameter ist eine Menge der Klasse NSSet von UITouch Objekten die eine Fingerber hrung auf dem Bildschirm repr sentieren Der zweite Parameter ist ein UIEvent Objekt Der Methodenaufruf von touchesBegan withEvent leitet eine Gestensequenz ein Die folgenden Fingerbewegungen erh lt der Responder ber die Methode touches Moved withEvent Abgeschlossen wird die Geste ber einen Aufruf von entweder touchesEnded withEvent oder touchesCancelled withEvent Dabei kennzeichnet ein Aufruf der Methode touchesCancelled withEvent dass das System eine Geste abbrechen m chte siehe dazu die Beschreibung zu UIControlEventTouchCancel in Abschnitt 3 2 6 247 3 Views und Viewcontroller Diese Methoden sind die Grundlagen der Gestenverarbeitung Allerdings f hrt die Verwendung dieser Methoden in der Regel zu einer relativ festen Koppel
110. perty highlighted abfragen oder setzen gt UIControlStateDisabled setzt das Control inaktiv Es verarbeitet keine Eingaben und versendet auch keine Ereignisse Diesen Zustand k nnen Sie auch ber die Property enabled abfragen oder setzen Der Wert der Property ist dabei jedoch genau umgekehrt zu dem Wert in der Bitmaske gt UIControlStateSelected zeigt den Auswahlzustand des Controls an Diesen Zustand k nnen Sie auch ber die Property selected abfragen oder setzen Ein Control kann mehrere Zust nde gleichzeitig aktiviert haben Wenn kein Zustand in der Bitmaske gesetzt ist hat das Control den Zustand UIControlStateNormal Am ausgiebigsten machen Buttons von den Zust nden Gebrauch Buttons sind relativ komplexe Controls die mehrere Darstellungselemente unter st tzen Die Darstellungselemente k nnen Sie in Abh ngigkeit von den Zust nden setzen Sie k nnen f r jede Zustandskombination eine eigene Darstellung festlegen Au erdem k nnen Sie ber die Property adjustsImagehhenHighlighted zus tzlich festlegen dass der Button beim Dr cken noch einen Gl heffekt anzeigt Abbildung 3 24 stellt rechts jeweils einen Button im Zustand highlighted ohne und mit Gl hef fekt dar 242 3 2 Views und Viewcontroller Abbildung 3 24 Die verschiedenen Darstellungstypen f r Buttons Ein Button kann einen von sechs vordefinierten Darstellungstypen haben wobei f nf Typen ein festes Aussehen haben siehe Abbildung 3 24 links
111. r Hier erfolgt der lesende Zugriff auf den Wert auch ber das Attribut und nicht ber den Getter Der w re hier kontraproduktiv da er ja den Ton l dt falls die App ihn noch nicht geladen hat Diese Implementierung stellt au erdem sicher dass das Delegate den alten Alarmton immer freigibt wenn Sie einen neuen ber den Setter setzen Das Application Delegate kann ber die Methode applicationDidReceiveMemoryWarn ing auch auf Speicherwarnungen reagieren Da es den Alarmton jederzeit wieder laden kann sollten Sie in dieser Methode den Property Wert f r soundId auf nil set zen um den Ton freizugegeben und dadurch Speicherplatz einzusparen void applicationDidReceiveMemoryWarning gt UIApplication inApplication self soundId nil Listing 3 50 Freigabe des Alarmtons bei einer Speicherwarnung Ressourcen sind vielf ltig Auch der Alarmton stellt eine Ressource des Programms dar die nach der Termino logie aus Abschnitt 3 2 11 wiederherstellbar ist Dabei besteht zwar die Referenz auf den Ton nur aus einigen Bytes die Tondaten d rften aber wesentlich gr er sein 3 4 Eine App f r alle Im Springboard das ist der Home Screen unter iOS ber den Sie Apps starten erscheint f r Ihre App nur ein wei es abgerundetes Quadrat mit einem Glanzeffekt und dem Namen AlarmClock Sie k nnen nat rlich auch ein eigenes Icon anzeigen lassen Das Bild muss im PNG Format in den folgenden Gr en vorliegen Display Typ Be
112. r CLASS eingeben siehe Abbildung 3 28 legt Xcode beim Speichern die Dateien UIView AlarmClock h und UIView AlarmClock m an In die Headerdatei tragen Sie die Deklarationen f r die beiden Methoden ein Au erdem sollten Sie die System headerdatei f r das UIKit importieren Die komplette Datei finden Sie in Listing 3 28 249 3 Views und Viewcontroller Choose options for your new file AlarmClock Class Luten Te Previous EEE Abbildung 3 28 Anlegen einer Kategorie f r die Wecker App import lt UIKit UIKit h gt interface UIView AlarmClock CGPoint midPoint CGPoint pointWithRadius CGFloat inRadiuse angle CGFloat inAngle end Listing 3 28 Deklaration der Kategorie Analog verschieben Sie die Implementierungen dieser beiden Methoden aus der Klasse ClockView in den Implementierungsblock der Kategorie in der Datei UIView AlarmClock m Durch das Entfernen der Methoden zeigt Xcode in der Klas senimplementierung Fehler an Um sie zu eliminieren sollten Sie die Kategorie in die Datei ClockView m importieren Dazu f gen Sie die Anweisung import UI View AlarmClock h vor dem Implementierungsblock ein Damit Sie die Methoden auch im neuen Control verwenden k nnen f gen Sie die Importanweisung au er dem an den Anfang von ClockControl m ein Die Methode angleWithPoint berechnet ber die C Funktion atan2 zu einem Punkt im Control den Winkel der Linie die vom Mittelpunkt zu diesem
113. r immer l uft wenn sie die Applikation anzeigt Sie m ssen dazu nur noch Ihren Viewcontroller mit den Uhren bekannt machen Sie k nnen in NIB Dateien nicht nur den View Aufbau speichern sondern auch Ver bindungen zwischen den Objekten im NIB und dem Eigent mer der NIB Datei her stellen Der Eigent mer wird auch File s Owner genannt Der Eigent mer ist dabei das Objekt das die Datei ge ffnet hat Das ist in der Regel der Viewcontroller Es gibt vier Verbindungstypen gt Actions sind Verbindungen zwischen Views die Ereignisse versenden und Metho den die diese Ereignisse verarbeiten Damit k nnen Sie beispielsweise einen Methodenaufruf ausl sen wenn Sie einen Button dr cken Dieser Verbin dungstyp ist Gegenstand des Abschnitts 3 2 5 gt Ein Outlet verbindet ein Objekt in der NIB Datei mit einem Attribut oder einer Property eines anderen Objekts Auf der Seite des Eigent mers ist ein Outlet ein fach ein Attribut oder besser eine Property mit denen Sie dann auf das Objekt zugreifen k nnen Im zweiten Kapitel haben Sie zum Beispiel einen Textview ber ein Outlet mit dem Viewcontroller verbunden gt Eine Outlet Collection verbindet mehrere Objekte mit einem Array Attribut oder einer Array Property Sie k nnen ber Outlet Collections also auf mehrere gleich artige Objekte des NIBs zugreifen Diesen Verbindungstyp gibt es erst seit iOS 4 0 gt Ein Segue bergang verbindet in einem Storyboard unter iOS 5 jeweil
114. r inter aktiven R ckmeldung des Zustands an den Nutzer w hrend das Ereignis Touch Up Inside die Verarbeitung des endg ltigen Wertes in der App ausl st Sie k nnen jedoch auch noch andere Ereignisarten sinnvoll verwenden Beispielsweise k nnen Sie durch den Ereignistyp Touch Up Outside einen Abbruch der Operation erm gli chen indem Sie daf r eine Actionmethode implementieren die den alten Zustand wiederherstellt 254 3 2 Views und Viewcontroller Gestenverarbeitung ber Gesture Recognizer Mit der iOS Version 3 2 beziehungsweise 4 0 hat Apple eine weitere Moglichkeit der Gestenverarbeitung eingef hrt Die Klasse UIGestureRecognizer erm glicht eine Implementierung von Gestensteuerungen die von den Views getrennt ist Damit k nnen Sie jede beliebige Gestenverarbeitung zu jedem View hinzuf gen Der Gesture Recognizer trennt also die Eingabeverarbeitung von der Darstellung des Views Dadurch sind diese beiden Aufgaben Darstellung und Ereignisverarbeitung vollkommen unabh ngig voneinander oder auch orthogonal zueinander und Sie k nnen die entsprechenden Komponenten Views und Gesture Recognizer nahezu beliebig miteinander kombinieren Die Klasse UIView bietet zwei Methoden und eine Property zum Verwalten von Gesture Recognizern an Mit addGestureRecognizer f gen Sie einem View einen neuen Gesture Recognizer hinzu den Sie mit removeGestureRecognizer wieder ent fernen k nnen Mit der Property gestureRecognizers k nn
115. rchf hren Dragging da Sie mit diesem Recognizer auch die Richtung und die Distanz der Geste ermitteln konnen Auch bei diesem Gesture Recognizer konnen Sie die Anzahl der beteiligten Finger vorgeben 6 UILongPressGestureRecognizer erkennt l ngere Ber hrungen des zugrunde lie genden Views Diese Gestenauswertung eignet sich sehr gut wenn ein View unter schiedliche Gestenarten unterst tzen soll Beispielsweise k nnen Sie eine Karte scrollen und durch l ngeres Dr cken eine Markierung setzen Auch bei diesem Gesture Recognizer k nnen Sie die Anzahl der beteiligten Finger einschr nken Au erdem k nnen Sie eine minimale Dauer f r die Ber hrungsl nge w hlen Sie k nnen auch eigene Unterklassen der Klasse UIGestureRecognizer schreiben und so eine eigene Gestenverarbeitung implementieren Daf r besitzt die Klasse die glei chen vier Methoden die auch die Klasse UIResponder bereitstellt Zus tzlich gibt es eine Methode reset Sie k nnen diese Methode berschreiben um nach dem Abschluss einer Geste Ihren Gesture Recognizer f r die n chste Geste zur ckzusetzen Gesture Recognizer unterst tzen wie Controls den Target Action Mechanismus allerdings ohne Ereignistypen Sie k nnen ber die Methode addTarget action eine neue Aktion hinzuf gen die Sie mit removeTarget action auch wieder entfernen k nnen Das Beispielprojekt verwendet einen UILongPressGestureRecognizer um die Alarm zeit zus tzlich zur Zeigerdrehung einstel
116. re notwendige Schritte verwenden Die Gr en der Uhren lassen sich ber den Gr eninspektor auch beliebig anpassen Sie k nnen sogar 225 3 Views und Viewcontroller Ziffernblatter erzeugen die nicht kreis sondern ellipsenformig sind Letztere sehen allerdings etwas gew hnungsbed rftig aus Au erdem k nnen Sie die Farbe f r den Hintergrund hinter dem Ziffernblatt frei w hlen Ein Beispiel daf r sehen Sie in Abbildung 3 16 Abbildung 3 16 Wiederverwendung eines Views Ein m glichst hoher Wiederverwendungsgrad sollte immer Ihr Ziel bei der Entwick lung eigener View Komponenten sein Zugegebenerma en kann der View auch nur eine Uhrzeit darstellen Sie lernen im Verlauf dieses Buches noch weitere M glichkei ten kennen wie der View mit den Objekten aus den anderen Schichten interagieren kann ohne dass dabei Abh ngigkeiten zu Klassen aus diesen Schichten entstehen 3 2 Views und Viewcontroller Das Beispielprojekt Clock zeigt zwar mehrere Uhren an deren Zeiger bleiben aber ste hen Das liegt daran dass dieses Programm nicht die Methode startAnimation auf ruft Wenn Sie diesen Aufruf in die Methode awakeFromNib in der Klasse ClockView einf gen bewegen sich die Zeiger Allerdings startet dann das Laden des Views die Timer und erst der Aufruf der Methode dealloc der Uhren stoppt sie Die Uhren lau fen also st ndig Bei so einer kleinen App die nur eine Ansicht zeigt ist das zwar nicht schlimm In gr eren Projekten
117. rmClock AlarmCockappOelegate h Im AlarmCiockappDeiegate m AlarmClockViewController h m AlarmClockViewController m gt J Supporting Files Ed a IK ClockViem h Oo Im Clock View m D r C Frameworks Products m D vjeim g oe EE r View Controller A controller that IO supports the fundamental view Bu 2 Ne Selection management model in Phone 05 Local a 1 All Outpt 5 Clee ME View Represents a rectangular region In which i drams and receives events Ls oma b uiview Abbildung 3 6 Einen neuen View im Interface Builder anlegen Der neue View hat automatisch dieselbe Gr e wie der bereits vorhandene erhalten Da das Ziffernblatt des Weckers aber nicht den ganzen Bildschirm ausf llen soll mar kieren Sie den gerade hinzugef gten View indem Sie ihn anklicken und ffnen rechts oben im Xcode Fenster den Gr eninspektor siehe den Mauszeiger in Abbil dung 3 7 alternativ dr cken Sie alt cmd 5 Der Gr eninspektor In Xcode bis Version 4 4 einschlie lich zeigt der Gr eninspektor unterhalb der Gr eneinstellungen das Autosizing anstatt der Autolayouteinstellungen an In Xcode 4 5 k nnen Sie zwischen Autosizing und Autolayouts im Dateiinspektor der XIB Datei wechseln diese Einstellung ist allerdings beim AlarmClock Beispielprojekt noch irrelevant Mehr zu diesem Thema finden Sie in Kapitel 5 Daten Tabellen und Controller Setzen Sie die Koordinaten und die Gr
118. rollerAnimated popToViewController animated 335 popViewControllerAnimated 335 PGT assests Eege 863 DEI Or 593 BOS ADRIEN 850 EIZEUGEN E 854 postNotification EE 408 postNotificationName object sss 1ss 111ss11 408 postNotificationName object userInfo 408 Pr dikat nee as 482 Pr sentation Layer ee 584 prepareForSegue sender el na permittedArrowDirections animated 330 presentPopoverFromRect inView permittedArrowDirections animated 330 presentViewController animated tompletions aun seneeienn 325 386 previousFailureCount s ss ss1ss11s11s11s11s111e 846 PANDA Printf Debugging leie EE e E Produkt 202 919 Brel Geteste E 948 Profilinstallation ee 948 Programmbibliothek 922 Drogrammiersptrache EE 55 Programmzei er n useeue sseseene 295 Project B ilder 4u s 0 40 883 Projekt Messina 919 anlegen entire 29 Ausf hren sn ea 31 Projektd tei u uen see 913 Droiektnavigator EE 885 Projektverwaltung EE 912 Prop rty Eed nal 88 909 animietbaT senorna 602 bounds STATOR Sh athe ik os ath nd sso ste ated es GE EE redeklarieren rootViewController propertyListWithData options format error Protection class Protokoll informelles Provisioning Profile Prozessgruppe Prozessorarchitektur Pseudozufallszahl Punktnotation und Debugger readonly readwrite Refactoring Refer
119. rols an UIControlEventTouchDragExit sendet das Control wenn Sie die Finger aus dem Control heraus bewegen Dieser Ereignistyp markiert den bergang von UIControl EventTouchDragInside zu UIControlEventTouchDragOutside UIControlEventTouchDragEnter sendet das Control beim Verschieben des Fingers in das Control hinein Dieser Ereignistyp markiert den Ubergang von UIControl EventTouchDragOutside zu UIControlEventTouchDragInside Sie konnen sich sehr komplexe Gesten ausdenken und mit diesen Ereignistypen umsetzen Allerdings scheinen die von au erhalb des Controls gesendeten Ereig 240 3 2 Views und Viewcontroller nisse nicht so zuverlassig zu funktionieren Es kann beispielsweise vorkommen dass Sie bei einer Fingerverschiebung aus dem Control heraus noch weitere UIControl EventTouchDragInside Ereignisse empfangen Die Umschaltung auf UIControlEvent TouchDragOutside erfolgt teilweise erst wenn sich der Finger schon lange au erhalb des Controls befindet Wenn Sie also diese Ereignistypen verwenden m chten soll ten Sie ausgiebige Tests auf Ger ten mit einplanen Viele Gesten lassen sich indes relativ einfach umsetzen und Sie k nnen beispiels weise Mehrfachtaps mit folgender Actionmethode auswerten die Sie mit dem Ereig nistyp UIControlEventTouchDownRepeat verbinden IBAction handleMultiTap id inSendera forEvent UIEvent inEvent UITouch theTouch inEvent allTouches anyObject if theTouch tabCount 2
120. rwenden k nnen m ssen Sie diesen als Ressource zu Ihrem Projekt hinzuf gen Dazu ziehen Sie einfach die gew nschte Datei auf die Gruppe SUPPORTING FILES in der Navigatorspalte des Projekts Sie sollten im folgenden Dia log darauf achten dass Xcode die Datei auch in das Projekt kopiert und dem Target ALARMCLOCK zuordnet Setzen Sie dazu die H ckchen in den Checkboxen DESTINA TION und ADD TO TARGETS Sie k nnen anschlie end den Systemton bei der Erzeu gung der lokalen Benachrichtigung auch durch die Sounddatei ersetzen indem Sie den Dateinamen ohne Pfadangabe verwenden Tauschen Sie dazu einfach die Zuwei sung des Klangnamens in Listing 3 43 durch die folgende Anweisung aus theNotification soundName ringtone caf Im Gegensatz zu dem Systemton k nnen Sie diesen Klang auch ber Funktionen aus der Audio Toolbox abspielen wozu Sie allerdings dieses Framework einbinden m s sen W hlen Sie dazu zun chst das Target der App aus Ein Xcode Projekt kann meh rere Produkte zum Beispiel Apps oder Frameworks verwalten Jedes Produkt hat dabei sein eigenes Target Es legt die Dateien und Regeln zur Erstellung des jeweiligen Produkts fest Sie erreichen das Target wenn Sie in der linken Navigatorspalte das Projekt ausw hlen Daneben erscheint eine Spalte mit dem Abschnitt TARGETS W h len Sie dort das Target ALARMCLOCK aus siehe Abbildung 3 39 links 000 gt m AlarmClock iPad 4 2 Simulator gt SA EA WS 1 target
121. ryboards ein XML Format Wenn die Deserialisierung die Methode initWithCoder des neuen Objekts aufruft bergibt sie einen Parameter vom Typ NSCoder mit den notwendigen Daten f r die ses Objekt Da Ihre Klasse jedoch die Serialisierung nicht erweitert brauchen Sie den Parameter nur f r den Initialisierer Aufruf der Oberklasse Wenn Sie die Methode initWithCoder implementieren sollten Sie immer als Erstes diese Methode der Oberklasse so wie in Listing 3 12 aufrufen id initWithCoder NSCoder inCoder self super initWithCoder inCoder if self self calendar NSCalendar currentCalendar self time NSDate date 221 3 Views und Viewcontroller return self Listing 3 12 Initialisierung der Propertys bei der Deserialisierung Nach der Erzeugung aller Objekte aus einer NIB Datei ruft Cocoa Touch die Methode awakeFromNib bei allen erzeugten Objekten auf Wenn Sie diese Methode berschrei ben sollten Sie auch immer als Erstes die Methode in der Oberklasse aufrufen void awakeFromNib super awakeFromNib self calendar NSCalendar currentCalendar self time NSDate date Listing 3 13 Initialisierung der Propertys nach der Deserialisierung Verlassen Sie sich weder bei initWithCoder noch bei awakeFromNib auf eine feste Auf rufreihenfolge F r die Initialisierung ist h ufig awakeFromNib die geeignetere Wahl da bei Aufruf dieser Methode auch alle anderen Objekte des NIB Files die Initia
122. s den Inhalt des Views neu zeichnen muss 3 1 1 Zeichnen in Cocoa Touch Als N chstes erstellen Sie den Code um alle Bestandteile der Uhr also Ziffernblatt und die Uhrzeiger zu zeichnen Daf r verwenden Sie das CoreGraphics Framework CoreGraphics ist ein sehr m chtiges Framework das auf reinem C und nicht auf Objective C basiert Deshalb enth lt es keine Klassen und Methoden sondern Daten typen Strukturen und Funktionen Alle zum CoreGraphics Framework geh renden Elemente erkennen Sie am Pr fix CG Der Aufbau und die Implementierung der Datentypen in den Frameworks sind vor dem Nutzer versteckt Sie k nnen auf die Datentypen nur ber Referenzen zugreifen Die Referenzen bergeben Sie an Funktionen die eine bestimmte Operation ausf h ren Auf diese Art implementierte Datentypen nennt man auch opake Datentypen Der zentrale Datentyp in CoreGraphics ist der Grafikkontext und die Referenzen dar auf haben den Typ CGContextRef Ein Grafikkontext speichert alle Werte f r den aktu ellen Zustand Ihrer Zeichenoperationen Wenn Sie eine Zeichenoperation ber einen Grafikkontext ausf hren m chten m ssen Sie also zuerst die Parameter wie Farben Muster und Clipping festlegen und danach die gew nschte Operation aufrufen F r das Ziffernblatt werden Sie zun chst einen wei en Kreis als Grundfl che zeichnen Die entsprechenden CoreGraphics Operationen dazu sehen wie folgt aus void drawRect CGRect inRectangle CGContextRef
123. s der Kalenderklasse k nnen Sie ein NSDateComponents Objekt berechnen lassen das die ben tigten Zeitkomponenten Stunde Minute und Sekunde enth lt Mit den oben angegebenen Formeln k nnen Sie daraus dann die entsprechenden Winkel f r die Darstellung bestimmen Wenn Sie allerdings die Stunde in einen Winkel umrechnen bekommen Sie einen Stundenzeiger der immer nur auf volle Stunden zeigt Bei einer analogen Uhr soll er jedoch beispielsweise um halb f nf genau zwischen der vierten und f nften Stunde stehen Das k nnen Sie erreichen indem Sie zum Stundenwert den Minutenanteil hinzurechnen Da eine Stunde bekanntlich 60 Minuten hat ist der Minutenanteil einer Stunde ein Sechzigstel des Minutenwertes NSDateComponents theComponents self calendar components NSHourCalendarUnit NSMinuteCalendarUnit NSSecondCalendarUnite fromDate self time CGFloat theSecond theComponents second M PI 30 0 CGFloat theMinute theComponents minute M PI 30 0 CGFloat theHour theComponents hour theComponents minute 60 0 M PI 6 0 Listing 3 9 Berechnung der Winkel f r Sekunde Minute und Stunde Die Variablen theSecond theMinute und theHour enthalten den Winkel f r die ent sprechende Zeigerstellung Der Faktor x 30 2x 60 in der Berechnung entspricht dabei dem Winkel im Bogenma von einer Sekunde beziehungsweise einer Minute Analog ist x 6 2x 12 der Winkel der einer vollen Stunde auf einem Ziffernblatt ent
124. s einen Viewcontroller oder einen View der Ereignisse versendet mit einem Viewcontrol ler Der bergang beschreibt dabei den Wechsel von einem Viewcontroller zu einem anderen berg nge werden in Abschnitt 3 2 9 besprochen 4 Cocoa Touch erlaubt zwar Outlets und Outlet Collections ber Ivars Da Sie jedoch eine etwas eigent mliche Speicherverwaltung haben sollten Sie lieber Propertys bevorzugen 227 3 Views und Viewcontroller 3 2 1 Outlets Outlets erzeugen Sie tiber den Interface Builder Offnen Sie dazu den View des Bei spielprojekts indem Sie die Datei AlarmClockViewController xib auswahlen Aktivie ren Sie in der Werkzeugleiste den Hilfseditor durch den mittleren Button in der Gruppe EDITOR in Abbildung 3 17 oben rechts Der Hilfseditor sollte nun die Header datei AlarmClockViewController h des Viewcontrollers anzeigen Sie konnen die angezeigte Datei ber die Men leiste des Editors unterhalb der Werkzeugleiste ndern falls der Editor eine andere Datei ge ffnet haben sollte Wenn Sie jetzt mit der rechten Maustaste oder mit der linken bei gedr ckter ctr1 J Taste auf das Ziffernblatt klicken k nnen Sie eine Verbindung von dem View zu der Headerdatei des Controllers ziehen wie Abbildung 3 17 zeigt w imi a gt Automatic AlarmClockViewController h No Selection import lt UIKit UIKit h gt interface AlarmClockViewCo Insert Outlet or Outlet Collection
125. s en a Eben EE DtlebdeelOosetg use Toll Free Bridge Toll Free Brideing EE 597 TROT OMS Yaseen Se RUT lane es 869 toolbarltems en asesukenssheisissne 343 Tools u 980 Top Level Objekt eent 235 Speichervermaltung 267 IouchesbBegan with Event 247 touchesCancelled withEvent 247 618 touchesEnded withEvent nn 247 touchesMoved withEvent een 247 touchesShouldBegin withEvent inContentView unse 617 touchesShouldCancellnContentView 618 TOUCHXM Lues Hensel 811 toValuer su elle 592 Training 980 Trainingsplan u 980 e EEN 560 608 Transformation Eloge 608 eines VIEWS un er 560 Transformationsmatrix eeee 560 589 Transformationsmatrix Transition tunen transitionWithView duration options animations completion ueeee 566 translatesAutoresizingMaskInto Constraints Trust Boundary Trust Modelle TU Wien Twitter TWTweetComposeViewController 500 504 Typisierung 67 Typlosiekeit nun 69 U bergang berschreiben U U U UL APPEARANCE SELECTOR UlAcceleration UlAccelerometer UlActivityIndicator Her EW Ee EE UlApplication UlApplicationDelegate UlApplicationMain UlApplicationStateActive UlBarButtonltem e 337 343 344 UlBarButtonSystemItemCompose 351 UIBarButtonSystemItemDone UIBarButtonSystemltemSave UlButton UiButton TwvpeCustom UICollectionElementKindSectionFooter 514 UIColle
126. sendet das Control bei der ers ten Ber hrung UIControlEventTouchDownRepeat sendet das Control bei mehreren schnell aufein anderfolgenden Ber hrungen nach UIControlEventTouchDown Sie k nnen mit die sem Ereignistyp beispielsweise Doppel oder Dreifachtaps auswerten Die Anzahl der Taps k nnen Sie ber die Property tapCount aus den Touchobjekten des Ereig nisses erfragen Die Touchobjekte erhalten Sie ber die Property allTouches der Klasse UIEvent siehe Listing 3 21 UIControlEventTouchUpInside beendet eine Geste wenn sich der Finger zuletzt innerhalb des ausl senden Controls befunden hat Sie verwenden diesen Ereignis typ in der Regel als Aktionsausl ser bei Buttons UIControlEventTouchUpOutside beendet eine Geste wenn sich der Finger zuletzt au erhalb des ausl senden Controls befunden hat Sie verwenden dieses Ereignis in der Regel um den Abbruch einer Geste durch den Nutzer zu verarbeiten UIControlEventTouchCancel bricht eine Geste ab Dieser Ereignistyp wird beispiels weise an Controls innerhalb eines Scrollviews gesendet wenn Cocoa Touch erkennt dass Sie mit der Geste scrollen m chten und die Ereignisse nicht das Con trol betreffen Cocoa Touch sendet dieses Ereignis auch wenn es die Gestenverar beitung wegen einer Speicherwarnung abbrechen muss UIControlEventTouchDragInside zeigt eine Fingerbewegung innerhalb des Con trols an UIControlEventTouchDragOutside zeigt eine Fingerbewegung au erhalb des Con t
127. sensensensensensnnsnsnssnnsnnnnnnnnn 4 5 1 Aufbau einer Reiternavigation AS 7 E EE 4 5 3 FUrein paar Controller mehr ENEE ENNEN 4 5 4 Der Tabbarcontroller im Storyboard ENEE 379 4 5 5 Die Gestaltungsm glichkeiten f r die Tabbar unter iOS 5 en 380 Der Pageviewcontroller AANEREN 381 4 6 1 Einen Pageviewcontroller erzeugen EE 382 4 6 2 Die Datenquelle und das Delegate 384 Eigene Container und Subviewcontroller ENEE 386 4 7 1 Container und Subviewcontroller EE 386 4 7 2 Eigene Subviewcontroller NEEN 391 4 7 3 Eigene Delegate Protokolle erstellen EE 396 4 74 Delegate Protokolle erweitern EE 397 Regelbasierte Anpassung der Oberfl che 399 ART Gestalt ngsregeln unuaa anne ae 399 4 8 2 und Gestaltungsm glichkeiten EE 402 Daten Tabellen und Controller 405 Benachrtchtteungen ENEE EEN EEN 405 5 1 1 Benachrichtigungen empfangen NEE 406 5 1 2 Eigene Benachrichtigungen verschicken ss ssssssesresssresssrresssrirssrrerssrresse 408 Layoutanpassungen und Viewrotationen NEEN 410 5 2 1 Flexible Views dank Autosizing NEEN 410 5 2 2 Lang lebe das RotationsprinZip En 413 5 2 3 Anpassung des Layouts 5 3 5 4 5 5 5 6 5 7 5 8 5 9 Autolayout amp 4 2 amp 4 2 0u 40 10 ee e AA 419 5 3 1 Restriktionen im Interface Builder festlegen E 419 5 3 2 Restriktionen per Programmcode erstellen uuneesesseesnenenneneennen 425 5 3 3 Autolayout und Lokalisierung En 431 Core Data sine EEN 434 5 4 1 D
128. setAngle berge ben F r die Speicherung verwendet das Control eine private Property savedAngle Die Implementierung dieser Methoden sieht also wie folgt aus BOOL beginTrackingwithTouch UITouch inTouche withEvent UIEvent inEvent self savedAngle self angle self updateAngleWithTouch inTouch return YES H BOOL continueTrackingWithTouch UITouch inTouche withEvent UIEvent inEvent self updateAngleWithTouch inTouch return YES void endTrackingWithTouch UITouch inTouche withEvent UIEvent inEvent 252 3 2 Views und Viewcontroller self updateAngleWithTouch inTouch void cancelTrackingWithEvent UIEvent inEvent self angle self setNeedsDisplay self savedAngle Listing 3 32 Die Methoden f r die Gestenverarbeitung Jetzt fehlt dem Control nur noch die Implementierung der Methode drawRect die einfach nur einen blauen Strich als Zeiger zeichnet Dabei verwendet sie w hrend der Gestenverarbeitung einen transparenten Blauton als R ckmeldung f r den Nutzer Diesen Zustand k nnen Sie ber die Property tracking der Klasse UIControl erfragen void drawRect CGRect inRectangle CGContex tRef theContext UIGraphicsGetCurrentContext CGRect theBounds self bounds CGPoint CGFloat CGPoint theCenter self midPoint theRadius CGRectGetWidth theBounds 2 0 thePoint self pointWithRadius theRadius 0 7 angle self time
129. spre chend ndern Legen Sie im Interface Builder einen Button an und stellen Sie ber dessen Attributinspektor f r die Zust nde DEFAULT HIGHLIGHTED und SELECTED die Titel ein klick beziehungsweise aus ein 244 3 2 Views und Viewcontroller Vorsicht bei ge nderten Methodensignaturen Wenn Sie die Signatur einer Actionmethode im Programmcode ndern sollten Sie alle Actionverbindungen im Interface Builder zu der urspr nglichen Methode l schen Ansonsten erhalten Sie einen Laufzeitfehler Besonders t ckisch sind dabei die nderungen zwischen Signaturen ohne und mit einem Parameter da sie sich nur durch einen Doppelpunkt unterscheiden Zwischen den Signaturen switchAni mation und switchAnimation besteht ein Unterschied Verbinden Sie den Button mit der Actionmethode indem Sie ein Band vom Button zum FILE S OWNER ziehen Wenn Sie das Band dort loslassen erscheint ein Dialog in dem Sie die Actionmethode ausw hlen k nnen Im Verbindungsinspektor des But tons k nnen Sie sehen dass der Interface Builder automatisch die Actionmethode mit dem Ereignis Touch Up Inside verbunden hat Der Button sendet dieses Ereignis wenn der Finger den Button losgelassen hat Nach dem Start des Programms ist die Uhr ausgeschaltet und der Button zeigt die Beschriftung EIN Wenn Sie den Button dr cken wechselt die Beschriftung auf KLICK und nach dem Loslassen auf Aus In diesem Zustand verbleibt der Button und die Uhr l uft Durch
130. spricht Ist er Ihr Typ Bei der Berechnung des Minutenanteils verwendet Listing 3 9 nicht 60 sondern 60 0 als Teiler Der Unterschied dieser beiden Werte ist ihr Datentyp Wahrend 60 den Typ int hat ist 60 0 ein double Da der Minutenwert theComponents minute den Typ NSInteger hat w rde bei einer Division durch 60 eine Ganzzahldivision ausgef hrt Der Minutenwert liegt immer zwischen O und 59 bei einer Ganzzahldivision kommt dabei also immer Tusch O heraus Die Rechnung k nnen Sie sich also auch sparen Bei einer Flie kommadivision erhalten Sie hingegen Werte zwischen O und 0 99 218 3 1 Eigene View Klassen in Cocoa Touch Jetzt brauchen Sie nur noch die drei Zeiger zu zeichnen indem Sie eine Linie vom Mittelpunkt des Views in Richtung des jeweiligen Winkels ziehen Die drei Linien unterscheiden sich jedoch nicht nur hinsichtlich ihres Winkels sondern auch in der Lange der Farbe und der Linienstarke Den Zielpunkt der Zeiger berechnen Sie jeweils ber die Methode pointWithRadius angle wobei Sie die unterschiedlichen L ngen durch die Verwendung unterschied licher Radien erzielen Das Zeichnen der einzelnen Zeiger istrecht hnlich und unter scheidet sich nur in den unterschiedlichen Zeichenattributen f r die Linien Die gesamte Methode drawClockHands sieht dann wie folgt aus void drawClockHands CGContextRef theContext UIGraphicsGetCurrentContext CGPoint theCenter self midPoint CGFloat theRadius
131. t die nderungen des Textes im Textfeld an 241 3 Views und Viewcontroller gt UIControlEventEditingDidEnd markiert das Ende der Eingabe in das Textfeld gt UlControlEventEditingDidEndOnExit markiert ebenfalls das Ende der Eingabe in das Textfeld Das Textfeld sendet dieses Ereignis anscheinend nur wenn der Nutzer das Textfeld durch Dr cken des Return Knopfes ber die Systemfunktion beendet Leider geht die Apple Dokumentation auf dieses Ereignis nicht genauer ein Ein View dessen Klasse keine Unterklasse von UIControl ist kann keine Ereignisse verschicken Wenn Sie indes ein Ereignis senden m chten beispielsweise um die Ber hrung eines Bildes zu verarbeiten k nnen Sie das Bild einfach in einen View mit der Klasse UIControl legen Sie legen ein solches Control wie einen Clockview an Zie hen Sie ein Viewobjekt an die gew nschte Stelle und ndern Sie dessen Klasse im Identit tsinspektor auf UIControl Im Verbindungsinspektor dieses Views finden Sie dann alle beschriebenen Ereignisse Sie k nnen dagegen auch einen Button verwen den der ebenfalls die Anzeige von Bildern unterst tzt 3 2 7 Controlzustande und Buttons Neben den Ereignissen unterst tzen Controls auch drei boolesche Systemzust nde Diese Zust nde werden durch eine Bitmaske in der Property state des Controls abge bildet gt UIControlStateHighlighted ist aktiv solange der Nutzer das Control gedr ckt h lt Diesen Zustand k nnen Sie auch ber die Pro
132. t fast fertig Das Ziffernblatt ist in diesem Stadium noch sehr minimalistisch Im n chsten Schritt f gen Sie die Zeichenoperationen f r die Darstellung der Stunden und Minutenein teilung hinzu Dazu braucht die Klasse ClockView zwei neue Methoden die Sie vor der drawRect Methode einf gen CGPoint midPoint CGRect theBounds self bounds return CGPointMake CGRectGetMidX theBounds CGRectGetMidY theBounds Listing 3 4 Berechnung des Mittelpunktes des Views Die Methode midPoint berechnet den Mittelpunkt des Views relativ zum bounds Rechteck Die Klasse UIView hat zwar eine hnliche Methode center die allerdings den Mittelpunkt des frame Rechtecks liefert Sie ist hierf r jedoch nicht geeignet da Sie ja das Ziffernblatt relativ zum View zeichnen m ssen 211 3 Views und Viewcontroller Mathematik fiir Einsteiger Sie werden sich m glicherweise fragen was die viele Mathematik im ersten gr e ren Beispiel soll Nun die Antwort ist einfach Mathematik begegnet einem Pro grammierer h ufiger als ihm bisweilen lieb ist Gerade bei der Erstellung von Frontends und der Arbeit mit Grafiken und Animationen ist in der Regel ein gutes mathematisches Grundverst ndnis gefragt Die im Wecker Beispiel angewandte Mathematik ist ja kein Selbstzweck sondern resultiert direkt aus der Verwendung des CoreGraphics Frameworks Eine kleine Auffrischung Ihres Wissens ber Bogen ma Winkelberechnung etc finden Sie bei Wikip
133. tRGBStrokeColor CGContextSetTextMatrix CGContextStrokePath CGImage CG CG CGPDFDocumentCreateWithURL CGPDFDocumentGetNumberOfPage 631 CGPDFDocumentGetPage CGPDFPageGetDrawingTransform CGRectOffset CGRectUnion CGRectValue ean Desk Policy 979 LGeocoder clipsToBounds CLLocationCoordinate2D C Code Signing Code Snippet Library Code Analyse Code Duplikat Code Kommentierung Code Sign Fehler Code Smell Coding Guidelines for Cocoa Collection Collectionview ou cccccscssessssscssssssssesssessecsseessecsseeess collectionView cellForltemAtIndexPath 513 collectionView didSelectItemAt IndexPath six ec ans 526 collectionView layout sizeForltemAt INGER ATH ss 2 en 511 522 collectionView numberOfltemsIn IELE O DEPOTE ATIE ee EA 513 collectionView viewForSupplementary ElementOfKind atIndexPath 514 collectionViewContentSize eent COlUMNNUMbET EE e EE Commit Animation Company iOS Developer Programm gi Completionblock ueeeee Compliance sinn components fromDate componentsJoinedByString s ssssisssissseee 185 Concurrent Versions System eee 75 connection didFailWithError 835 connection didReceiveAuthentication Challenge 846 connection didReceiveData eent 835 connection didReceiveResponse 835 connection didSendBodyData totalBytes Written totalBytes
134. ten eines Views relativ zu dessen umgebendem View berechnen m chten verwenden Sie die Bounds des umgebenden Views um den Frame des enthaltenen Views zu berechnen Das wird sp ter noch an ein paar Beispielen erl utert d 0 0 x y Ki x y A 0 Be o gt 1 gt E lt width gt lt width gt Abbildung 3 10 Rechteck f r Frame und Bounds Die Methode in Listing 3 2 ruft als Erstes die Initialisierungsmethode der Oberklasse auf und weist deren Ergebnis der Variablen self zu Danach berpr ft sie ob self nicht nil ist Wenn self auf ein Objekt zeigt kann sie das Objekt initialisieren und schlie lich auch zur ckgeben Vielleicht berrascht es Sie dass die Initialisierungsmethode self ver ndern kann oder nil zur ckliefern darf Das ist indes keine theoretische M glichkeit sondern wird auch eingesetzt Eine Initialisierungsmethode sollte beispielsweise nil zur ck geben wenn sie das Objekt nicht initialisieren kann Die Initialisierungsmethode initWithString der Klasse NSURL gibt beispielsweise nil zur ck wenn die angege bene URL einen syntaktischen Fehler enth lt 207 3 Views und Viewcontroller Die Klasse ClockView enth lt in einem Kommentarblock eine weitere Methode namens drawRect Entfernen Sie die Kommentarzeichen um diese Methode da Sie sie im Folgenden berschreiben werden Cocoa Touch ruft sie automatisch auf wenn e
135. tensystem Kopfleiste Kryptografie kSecAttrAccessibleAfterFirstUnlock kSecAttrAccessibleAfterFirst UnlockThisDeviceOnly eee 720 kSecAttrAccessibleAlWayS esses 720 kSecAttrAccessibleAlwaysThis Devicedn Yun 720 kSecAttrAccessibleWhenUnlocked 720 kSecAttrAccessibleWhen UnlockedThisDeviceOnly Last In First Out Last Modified Laufzeitfehler Laufzeitumgebung Launch Image Layer Klasse festlegen 571 ayoutAttributesForDecoration ViewOfKind decorationViewKind atInd xPath iergert e 526 ayoutAttributesForElementsInRect ayoutAttributesForSupplementary ViewOfKind atIndexPath ayoutlfNeeded Layoutlogik ayoutSubviews Lazy Getter nn nenn Mess Index Index oadNibNamed owner options 393 475 eet TE 266 393 Localizable strings ocationInView Log Navigator S LOGGING eine Login Kurzname EE 861 Lokale Variablen ne ee 66 Lokalisierung 4 seen 25 282 Lose Kopplung 120 Lower Camel Case 71 M MAINE es 834 ee E 282 Mainwipdow si 261 309 Mandatory Code Signing s 43 Mapitem unnaan en 878 mapltemForCurrentlocation ueee 879 mapType Mapview mapView annotationView callout AccessoryControlTapped ee 877 mapView viewForAnnotation ueee 876 mMasksToBounds ee 572 Matnabme EE 661 Master anna 955 ER 363 Masterviewcontroller EE 362 MAX MUMZOOMSCAle eet 615 Medienbib
136. tentsOfURL nnee 793 822 arrayWithObjects EE 186 AS NZS einen Ee 665 REISE ENEE Assistant Editor Atomar Attack Surface Reduction Attribut indiziertes optionales transientes Attributinspektor Audio Toolbos EE Aufrufstapel Ausdruck JSON Ausnahme Aussagekraftiger Name Authentisierung Autolayout ausschalten Autolayout Constraint e Automatic Reference Counting 32 135 162 automaticallyForwardAppearance AndRotationMethodsToChild ViewControllerg EE 390 Automatisches Referenzen Z hlen 149 155 162 fur einzelne Dateien ausschalten 784 und Blockfunktionen und Speicherlecks und Toll Free Bridge und Zombies autorelease Autorelease Pool Autoresizingmask und Restriktionen autoreverses Autorisierung Autosizing Autovervollst ndigung AVAudioPlayer AVAudioRecorder AVAudioSession awakeFromNib Awareness Eege 142 149 467 782 410 411 890 B Background backgroundColor badgeValue au 374 Base Internationalization ent 431 Basic Authentication nee 822 Basiskonfiguration ss ssssisssisssesssesisserrrsesersseens 932 Baumdarstellung u 234 EE ee OR 661 Bedrohungsanalyse EE 664 BedrohungsdatenbanK ss ssseissseissssrissserssseee 984 beginAnimations Context 565 beginAppearanceTransition animated 390 beginbBefreszhbing EE 779 II eg Kl GE 600 beginTrackingWithTouch withEvente 2
137. text Listing 3 10 So werden die Uhrzeiger des Weckers gezeichnet 3 1 3 View Erzeugung ber NIB Dateien Sie m ssen den beiden Propertys calendar und time vor der ersten Anzeige des Views nun noch sinnvolle Werte zuweisen Dazu k nnen Sie die Initialisierungsmethoden entsprechend erweitern Die betreffenden Werte m ssen Sie in der Methode dealloc nat rlich auch wieder freigeben indem Sie die Propertys auf nil setzen Der Convenience Konstruktor date der Klasse NSDate erzeugt ein Datumsobjekt mit der aktuellen Uhrzeit in GMT und currentCalendar liefert ein Kalenderobjekt das den aktuellen Einstellungen des iPhones entspricht id initWithFrame CGRect inFrame self super initWithFrame inFrame if self self calendar NSCalendar currentCalendar self time NSDate date return self void dealloc self calendar nil self time nil super dealloc Listing 3 11 Initialisierung und Freigabe der Propertys der Zeitanzeige Ihr Programm verwendet die Initialisierungsmethode initWithFrame allerdings nur wenn Sie Ihren View direkt ber Programmcode erzeugen Die App l dt diesen View jedoch aus einer NIB Datei oder einem Storyboard und ruft dabei diese Methode nicht auf Fur diesen Fall gibt es zwei m gliche Alternativen Sie k nnen eine weitere Initialisie rungsmethode namens initWithCoder oder eine Methode namens awakeFromNib implementieren Sie d rfen dabei eine oder auch beide
138. timmt werden Diese Beispiele stellt Abbildung 3 13 grafisch dar 12 Uhr 360 Z r 10 Minuten 9 Uhr 3 Uhr 6 Uhr Abbildung 3 13 Beziehung zwischen Uhrzeiten und Winkeln Das Ziffernblatt soll Minuten durch einen Punkt und Stunden durch einen Strich dar stellen Die Striche f r drei sechs neun und zw lf Uhr sollen dabei etwas l nger als die sonstigen Stundenstriche sein Die Einteilungen werden ber eine Schleife gezeich net die von O bis 59 l uft f r jede Minute ist jeweils ein Durchlauf vorgesehen Da alle Einteilungen die gleiche Farbe Linienst rke und Linienenden haben sollen k nnen Sie diese Einstellungen vor der Schleife festlegen Beachten Sie dass die Stun den Einteilungen Linien und die Minuten Einteilungen Kreise sind Die Linienfarbe m ssen Sie ber CGContextSetRGBStrokeColor setzen Die Stundenstriche sollen au erdem abgerundete Linienenden haben was Sie ber die Funktion CGContextSet LineCap festlegen k nnen Da diese runden Kappen jedoch auf beiden Enden der Linien sitzen reichen sie ber den Rand des Ziffernblattes hinaus Sie k nnen das durch ein Clipping verhindern Das ist eine unsichtbare Maske auf der Zeichenfl che mit der Sie die Zeichenfl che in Bereiche unterteilen k nnen Der Grafikkontext zeichnet dann nur in den Bereichen die zum Clipping geh ren Als Clipping Region 213 3 Views und Viewcontroller verwenden Sie den Kreis des Ziffernblattes Sie f gen dess
139. tion ClockView synthesize timer end Die neueren Xcode Versionen legen brigens bei Viewcontroller Klassen automa tisch jeweils eine anonyme Kategorie an Sie k nnen so die Property vor dem allgemeinen Zugriff verstecken In der anony men Kategorie k nnen Sie s mtliche Methoden und Propertys deklarieren die die Klasse ClockView nur intern braucht und die sie nicht f r die ffentlichkeit zur Verf gung stellt Die Verwaltung des Property Inhalts erfolgt ber die beiden Methoden startAnimation und stopAnimation auf die auch andere Klassen zugreifen d rfen interface ClockView UIView void startAnimation void stopAnimation end Listing 3 14 Deklarationen f r die automatische Aktualisierung der Zeitanzeige Ein Timer kann eine Methode in einem Objekt nach einer festen Zeitspanne aufrufen Er kann das einmal oder auch kontinuierlich machen In der Methode startAnima tion m ssen Sie also ein Timer Objekt erzeugen und starten wogegen Sie es in stop Animation anhalten und zerst ren Sie k nnen ber die Property f r den Timer au erdem verhindern dass die App den Timer versehentlich mehrmals startet Dazu pr ft die Methode in Listing 3 15 ber die Bedingung self timer nil ob die Pro perty timer nicht schon etwa auf einen Timer verweist void startAnimation if self timer nil self timer NSTimero scheduledTimerWithTimeInterval 0 52 target self selector selector updateTime Je userInfo nil
140. uch Outlet Attribute erzeugen Dazu mussen Sie das Gummiband in den Attributblock also zwischen die geschweiften Klammern der Klassendeklaration ziehen Allerdings halten sich Outlet Attribute nicht an die Speicherverwaltungsregeln Ein Outlet Attribut bekommt ein retain gesendet wenn es keinen Setter daf r gibt Verwenden Sie also auch hier lieber Pro pertys als Attribute Die neueren Xcode Versionen legen allerdings keine Attribut bl cke in den Header Dateien mehr an und Sie sollten darauf auch m glichst verzichten BB AiarmClockViewController xib English _ View _ Clock view 4 gt New Referencing Outlet Referencing Outlet Collections New Referencing Outlet Collection Abbildung 3 19 Der Verbindungsinspektor zeigt Verbindungen an Nach dem Laden der NIB Datei verbindet Cocoa Touch diese Property mit dem View Sie k nnen sich die gesetzten und m glichen Verbindungen eines Objekts im Inter face Builder ber den Verbindungsinspektor ansehen siehe Abbildung 3 19 Wenn Sie die Maus ber eine Verbindung im Inspektor bewegen hebt der Interface Builder den damit verbundenen View in der Ansicht hervor Indem Sie die entsprechenden Anweisungen in die Methoden viewDidAppear und viewWillDisappear einf gen k nnen Sie ber den Viewcontroller jetzt eine Uhr starten Die kompletten Methoden m ssen Sie in die Implementierungsdatei Alarm ClockViewController m schreiben 230 3
141. uchposition in thePoint auswerten Listing 3 21 Ermittlung der Touchposition 236 3 2 Views und Viewcontroller Sie sollen jetzt einen Schalter das ist ein View der Klasse UISwitch daf r verwenden den Animationsstatus einer Uhr aus dem Clock Projekt zu steuern F gen Sie dazu einen UISwitch hinzu Das ist ein Schiebeschalter mit zwei Zust nden f r an und aus Nach dem Einf gen ziehen Sie von dem Schiebeschalter ein Band in den Hea der des Viewcontrollers In dem Pop over Dialog haben Sie nun eine zus tzliche Aus wahlm glichkeit ACTION F llen Sie diesen Dialog wie in Abbildung 3 23 gezeigt aus B import lt UIKit UIKit h gt nme 4 class ClockView Connection interface AlarmClockViewController UIViewController Object File s Owner ClockView clockView Name switchAnimation Type Touch m property nonatomic strong IBOutlet ClockView clockView Event Value Changed p end Arguments Cancel Abbildung 3 23 Anlegen einer Actionmethode Das Control sendet das Ereignis Value Changed immer dann wenn sich der Wert ndert den das Control verwaltet Bei einem UISwitch ist das ein boolescher Wert der die Schalterstellung repr sentiert Sie k nnen nun die Actionmethode wie folgt in der Datei AlarmClockViewControl ler m implementieren IBAction switchAnimation UISwitch inSender if inSender on self clockView startAnimation else
142. und liefund der Nutzer die App ber die Nachricht aktiviert hat Sie k nnen diese Methode nutzen um auch dann eine Nachricht anzuzeigen wenn die App w hrend des Nachrichtenempfangs aktiv ist Mit dieser Methode k nnen Sie also die Benachrichtigung manuell verarbei ten Das Beispielprogramm soll eine Alertbox anzeigen und einen Ton abspielen 273 3 Views und Viewcontroller Allerdings sollten Sie die Alertbox auch nur dann anzeigen wenn die App bereits aktiv war Andernfalls sahe der Nutzer ja zwei Hinweise auf den Alarm direkt hinter einander was er zumindest als st rend oder sogar fehlerhaft ansehen k nnte Um diesen Effekt zu vermeiden k nnen Sie den Zustand der App beim Ausl sen der Benachrichtigung ber die Property applicationState des Singletons UIApplication unterscheiden Nur wenn die App den Zustand UIApplicationStateActive hat soll sie den Alarm ausl sen Die Nachricht zeigen Sie ber eine Alertbox an Dazu verwenden Sie die Klasse UI AlertView Die Alertbox in Listing 3 47 zeigt nur die Nachricht und einen OK Button an und l sst den Titel leer void application UIApplication inApplicatione didReceiveLocalNotification e UILocalNotification inNotification if inApplication applicationState gt UIApplicationStateActive UIAlertView theAlert o UIAlertView alloc initwithTitle nil essage inNotification alertBodye delegate nil cancelButtonTitle OK gt otherButtonTitles nil theAlert show
143. ung bernehmen soll Sie verwendet dazu die Methode pointInside withEvent die entscheidet ob der angegebene Punkt in dem View liegt oder nicht W hrend der Eventparameter bei beiden Methoden nil sein darf m ssen Sie den Punkt relativ zu dem Koordinatensystem des Views angeben Wenn Sie diese Methode aus dem Programmcode aufrufen m ssen Sie also in der Regel den Punkt erst umrechnen Die Klasse UIView stellt daf r die Methoden convertPoint fromView und convert Point toView bereit Die erste Methode rechnet den Punkt aus dem Koordinatensys tem des zweiten Parameters in das Koordinatensystem des Nachrichtenempf ngers um Bei der zweiten Methode sind die Koordinatensysteme des zweiten Parameters und des Empf ngers bei der Berechnung vertauscht 246 3 2 Views und Viewcontroller und raus bist du Wenn Sie die View Bestimmung f r die Gestenverarbeitung anpassen m chten sollten Sie in Ihren Views die Methode pointInside withEvent berschreiben Ein berschreiben der Methode hitTest withEvent ist in der Regel nicht notwendig Sofern Sie den Property Wert clipsToBounds eines Views auf NO setzen kann jeder Subview des Views ber dessen Grenzen hinaus zeichnen Allerdings empf ngt der Subview nur da Touches wo er auch innerhalb seiner umgebenden Views liegt Diese Situation stellt Abbildung 3 27 dar Cocoa Touch stellt den Subview der in der Hierarchie im Superview liegt zwar komplett auf dem Bildschirm dar dieser em
144. ung von View und Controller da der View meistens das Ergebnis einer Geste an den Control ler weiterreichen muss Falls Sie dennoch eine eigene Gestenverarbeitung ber diese Responder Methoden realisieren m chten sollten Sie die Kommunikation mit dem Controller ber Delegation realisieren Eine direkte Verwendung von Controller Eigenschaften im View ist eine Verletzung des MVC Architekturmusters weil dadurch eine Abh ngigkeit des Views von der Controllerschicht entsteht Responder Methoden und Delegation In Kapitel 2 Grundlagen haben Sie bereits die Delegation als Muster kennenge lernt Um den View mit der Controllerschicht lose zu koppeln erstellen Sie ein Pro tokoll das die Delegate Methoden deklariert Au erdem spendieren Sie dem View eine Property um ihn mit dem Delegate verkn pfen zu k nnen Dann k nnen die Responder Methoden des Views immer eine Delegate Methode aufrufen wenn sie die gew nschte Geste erkannt haben Sie sollten also nicht die Events einfach wei terleiten sondern lieber die erkannten Gesten Angenommen Ihr View soll Kreisbewegungen erkennen dann k nnte das Protokoll die Delegate Methode circleView didDetectsCircleWithCenter radius bereit stellen die der View nach der Erkennung eines Kreises aufruft Wenn Sie diese Geste aber in unterschiedlichen Views erkennen m chten sollten Sie daf r lieber einen Gesture Recognizer einsetzen Gestenverarbeitung ber Controls Eine andere M glichkeit e
145. veMemoryWarning didRotateFromInterfaceOrientation 389 416 dismissPopoverAnimated display Distributionszertifikat Divisionsrest Divisionsrestoperator Document Object Model Dokumentation DM Bam Doppeltap Doppelter Code doubleSided drawInRect withFont drawLayer inContext DUNS Nummer duration Ebene 1 Eigent mer einer NIB Datei Eigent merschaft Elementarer Datentyp Elevation of Privileges Empf nger enabled Encoding endAppearanceTranssition Endlosrekursion SOUEEN end Reftesbigg eer 779 endTrackingWithTouch withEvent 248 Entitat ea 669 e EE Entitlement Entitlements Entity Relationship Diagramm 434 Entwicklerzertifikat uee 43 ETelenisue an ne 238 Value Changed ee 237 Erg nzender View 514 Escape Seg enZ EEN 286 782 E 236 Event Handling 735 EXC BAD ACCESS iin 305 executeFetchRequest error s 482 495 Exit Methode 2 u 339 expectedContentLength eee 830 Extensible Markup Langunge s u 786 Extreme Programming 975 F Fast Emnumeration Fehlerbehandlung eeeeen Peblerbertcht H klegeuebe Zeene T teb tert Fetchreguest nn File Template Library s 1191151150110011001 File Transfer Protocol File s OWNET nssssssssssns11000000000005000e fil GC OlO Fries eres aneies au NIE GE FIUSMOGUS nen nee Formatstiing uses forwardInvocation
146. wcontroller auf bevor er den Zielviewcontroller anzeigt Wenn Sie mehrere berg nge von einem Viewcon troller aus aufrufen k nnen k nnen Sie diese anhand ihrer Kennung unterscheiden Die Kennung k nnen Sie ber das Eingabefeld IDENTIFIER im Attributinspektor des bergangs setzen siehe Abbildung 3 32 Die Unterscheidung im Programmcode kann dann anhand der Property identifier erfolgen die die Kennung des bergangs enth lt Listing 3 37 gibt Ihnen ein Beispiel daf r import SegueViewController h implementation SegueViewController void prepareForSegue UIStoryboardSegue inSegue sender id inSender if inSegue identifier isEqualToString dialog id theDialog inSegue destinationViewController theDialog initialisieren end Listing 3 37 Initialisierung eines Controllers bei einem bergang 260 3 2 Views und Viewcontroller Sie k nnen berg nge auch im Code ber die Methode performSegueWithIdenti fier sender ausl sen Mit dieser Methode lassen sich also berg nge auch ber Actionmethoden aufrufen IBAction performSegue id inSender Ea self performSegueWithIdentifier dialog sender inSender Listing 3 38 Ausl sung eines bergangs 3 2 10 Der Lebenszyklus eines Viewcontrollers Der Viewcontroller verwaltet den View er l dt ihn aus einer NIB Datei oder einem Storyboard Wie erzeugt Cocoa Touch hingegen den Viewcontroller Auf diese Frage gibt es zwei Antworten Ent
147. weder liegt er als serialisiertes Objekt in einer XIB Datei beziehungsweise einem Storyboard oder das Programm erzeugt ihn wie andere Objekte auch ber eine direkte Anweisung im Code F r den initialen Viewcontroller der Wecker App kommt wenn Sie Xcode 4 2 oder neuer verwenden die letzte Variante zum Einsatz Wenn Sie die Implementierung der Klasse AlarmClockAppDelegate ffnen finden Sie in der Methode application didFinishLaunchingwithOptions den entsprechenden Code Die zweite Anweisung in der Methode das ist die Zuweisung zu der Property viewController enth lt die Erzeugung des Viewcontrollers BOOL application UIApplication inApplicatione didFinishLaunchinghithOptions NSDictionary inOptions self window UIWindow alloc initWithFrame UIScreen mainScreen bounds autorelease self viewController gt AlarmClockViewController alloc initWithNibName AlarmClockVienController gt bundle nil autorelease self window rootViewController self viewController self window makeKeyAndVisible return YES lt mm Listing 3 39 Erzeugung des Viewcontrollers in der Wecker App ltere Xcode Versionen haben dagegen eine weitere XIB Datei mit dem Namen MainWindow xib angelegt ber diese Datei legt Xcode das Application Delegate den Viewcontroller und das Fenster der App an Sie finden diese Objekte jeweils als Top Level Objekte in der XIB Datei 261 3 Views und Viewcontroller
148. youtRelationEqual NSLocalizedString NSManagedObject NSManagedObjectContext s ssesisseiissseressees 442 NSMutableArray NSMutableData NSMutableRequest NSMutableString NSMutableURLRequest NSNotification NSNotificationCentel ese 406 NN OI aussen N hNumber NSNumber Literal NSObject Protokoll NSOperationQueue NSOutputStream NSPredicate NSPropertyListSerialization NSRange 826 639 NSStringEncoding 781 NSStringFromSelectot NSTimelnterval NSUInteger NSUndoManager NSURT rar 207 597 NSURLAuthenticationChallenge 846 NGURLConpection 823 833 861 NSURLConnectionDataDelegate 835 NSURLConnectionDelegate R R R R NSURLCredential R R R R NSURLCredentialStorage NSURLProtectionSpace NSURLRequest NSURLResponse Index Index N lsertefaults 355 NeNalue 231 449 592 610 Nutzerrestriktion ee 421 Nygaard Kristen EE 58 O Oberklasse nn sin 61 obje meg end EE 650 ObjectAtI nde ansera 185 Objective Chinn she 55 Objekten es een 58 delegierendes unn suesemuer 126 Objektbibliothek neeee 34 888 Objekt raphin 137 434 Objektkontext cea 441 Objektorientierte Programmierung 56 Objektv riable nt sans 66 observeValueForKeyPath ofObject change ee EEN 121 124 543 EE 665 ENEE 56 OPAEI Ya Nun 572 Opaker Datentyp 208 Opdyke William EE 901 openInMapsWithLaunchOpt
Download Pdf Manuals
Related Search
Related Contents
Avaya one-X Quick Edition Release 3.2.0 Telephone User Guide Proctor-Silex 88085 User's Manual PCS 570/560 取扱説明書 - yodobashi.com Kingston Technology System Specific Memory KVR667D2N5/1G Valgrind Documentation catalogo 2006 - fr-es.qxp my 1416 user reference.pages Copyright © All rights reserved.
Failed to retrieve file