Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Geleitwort
Vorwort
1 Hello iPhone
2 Grundlagen
3 Views und Viewcontroller
4 Alles unter Kontrolle
5 Daten, Tabellen und Controller
6 Models, Layer, Animationen
7 Programmieren, aber sicher
8 Datenserialisierung und Internetzugriff
9 Jahrmarkt der Nützlichkeiten
A Sicherer Entwicklungszyklus
Stichwort

Download:
- ZIP, ca. 49,9 MB
Buch bestellen
Ihre Meinung?

Spacer
Apps programmieren für iPhone und iPad von Klaus M. Rodewig, Clemens Wagner
Das umfassende Handbuch
Buch: Apps programmieren für iPhone und iPad

Apps programmieren für iPhone und iPad
Galileo Computing
1000 S., geb., mit DVD
39,90 Euro, ISBN 978-3-8362-1915-0
Pfeil 5 Daten, Tabellen und Controller
Pfeil 5.1 Benachrichtigungen
Pfeil 5.1.1 Benachrichtigungen empfangen
Pfeil 5.1.2 Eigene Benachrichtigungen verschicken
Pfeil 5.2 Layoutanpassungen und Viewrotationen
Pfeil 5.2.1 Flexible Views dank Autosizing
Pfeil 5.2.2 Lang lebe das Rotationsprinzip!
Pfeil 5.2.3 Anpassung des Layouts
Pfeil 5.3 Autolayout
Pfeil 5.3.1 Restriktionen im Interface Builder festlegen
Pfeil 5.3.2 Restriktionen per Programmcode erstellen
Pfeil 5.3.3 Autolayout und Lokalisierung
Pfeil 5.4 Core Data
Pfeil 5.4.1 Datenmodellierung
Pfeil 5.4.2 Implementierung von Entitätstypen
Pfeil 5.4.3 Einbindung von Core Data
Pfeil 5.4.4 Der Objektkontext
Pfeil 5.4.5 Die Nachrichten des Objektkontexts
Pfeil 5.4.6 Anlegen und Ändern von Entitäten in der Praxis
Pfeil 5.5 Texte, Bilder und Töne verwalten
Pfeil 5.5.1 Die Tastatur betritt die Bühne
Pfeil 5.5.2 Fotos aufnehmen
Pfeil 5.5.3 Töne aufnehmen und abspielen
Pfeil 5.6 Tableviews und Core Data
Pfeil 5.6.1 Tableviews
Pfeil 5.6.2 Tabellenzellen gestalten
Pfeil 5.6.3 Tableviews unter iOS 5
Pfeil 5.6.4 Buttons in Tabellenzellen
Pfeil 5.6.5 Zellen löschen
Pfeil 5.7 Core Data II: Die Rückkehr der Objekte
Pfeil 5.7.1 Prädikate
Pfeil 5.7.2 Aktualisierung des Tableviews
Pfeil 5.7.3 Das Delegate des Fetchedresultscontrollers
Pfeil 5.7.4 Tabelleneinträge suchen
Pfeil 5.8 Twitter
Pfeil 5.8.1 Der Twitter-Account
Pfeil 5.8.2 Hinzufügen des Twitter-Frameworks
Pfeil 5.8.3 Integration in das Fototagebuch
Pfeil 5.9 Collectionviews
Pfeil 5.9.1 Der Collectionviewcontroller
Pfeil 5.9.2 Gitterdarstellung
Pfeil 5.9.3 Zellen und die Datenquelle
Pfeil 5.9.4 Ergänzende Views
Pfeil 5.9.5 Freie Layouts
Pfeil 5.9.6 Freie Layouts und ergänzende Views
Pfeil 5.9.7 Zellen auswählen
Pfeil 5.9.8 Decorationviews

5 Daten, Tabellen und ControllerZur nächsten Überschrift

»Ich hoffe mein Schaden hat kein Gehirn genommen.«
– Homer Simpson

Als Beispielprojekt für dieses Kapitel legen wir ein Fototagebuch an. Das ist ein Notizbuch, in dem Sie Texte, Bilder und Töne chronologisch geordnet ablegen können. Dieses Projekt ist wesentlich umfangreicher als der analoge Wecker aus Kapitel 3, »Views und Viewcontroller«. Es ist deshalb nicht möglich, die einzelnen Schritte zum Erstellen dieser App zu beschreiben: Dies würde den Umfang unseres Buches sprengen. Das komplette Projekt finden Sie natürlich auf der DVD oder im GIT-Repository. Die Beschreibungen in diesem Kapitel konzentrieren sich auf die neuen und spannenderen Themen.

Projektinformation

Den Quellcode des nachfolgenden Beispiels finden Sie auf der DVD unter Code/Apps/Storyboard/PhotoDiary oder im Github-Repository zum Buch im Unterverzeichnis https://github.com/Cocoaneheads/iPhone/tree/Auflage_2/Apps/Storyboard/PhotoDiary.


Galileo Computing - Zum Seitenanfang

5.1 BenachrichtigungenZur nächsten ÜberschriftZur vorigen Überschrift

Delegation ist sehr praktisch, wenn bestimmte Aufgaben oder Informationen an ein anderes Objekt weitergereicht werden sollen. Häufig gibt es jedoch Situationen, in denen mehrere Objekte eine Information verarbeiten sollen.

Sie haben bereits das Application-Delegate und dessen Methoden kennengelernt. Es bietet Ihnen beispielsweise eine Methode an, mit der Sie Operationen ausführen können, bevor das iOS die App in den Hintergrund schickt. Sie können diese Methode benutzen, um den aktuellen Applikationszustand zu sichern. Das ist sicherlich für viele Applikationen ausreichend, die diese Zustandsdaten zentral – vorzugsweise im Application-Delegate selber – lagern. Wenn sich diese Daten hingegen über viele unterschiedliche Objekte verteilen, stößt dieses Vorgehen an seine Grenzen.


Galileo Computing - Zum Seitenanfang

5.1.1 Benachrichtigungen empfangenZur nächsten ÜberschriftZur vorigen Überschrift

Cocoa Touch bietet dafür indes ein weiteres Vorgehen an, das sich für solche Aufgabenstellungen besser eignet. Dabei nutzen Sie Notifications oder Benachrichtigungen – das sind Objekte der Klasse NSNotification, die Sie innerhalb einer Applikation verschicken können. Jede Benachrichtigung hat einen Typ, der durch eine Zeichenkettenkonstante repräsentiert wird. Apple vereinbart in seinen Frameworks bereits mehrere Typen. Sie können allerdings auch eigene Typen definieren.

Jedes Objekt kann beliebige Benachrichtigungen empfangen. Sie müssen es dazu nur bei einem zentralen Objekt für die Verwaltung der Benachrichtigungen anmelden. Dieses Objekt hat die Klasse NSNotificationCenter. Sie registrieren einen Empfänger über die Methode addObserver:selector:name:object: des Notificationcenters. Der Empfänger muss sich immer bei dem Center anmelden, über das der Nachrichtensender seine Benachrichtigungen schickt. Sie können auf das Standardcenter von Cocoa Touch über die Klassenmethode defaultCenter zugreifen.

Mehrere Notificationcenter

In Cocoa Touch gibt es im Gegensatz zu Mac OS X zurzeit nur ein Center des Systems. Die Klasse ist jedoch kein Singleton, und Sie können beliebig viele weitere Objekte dieser Klasse anlegen. Sie können indes Nachrichten immer nur über das Center empfangen, über das der Absender sie verschickt hat. Systemnachrichten bekommen Sie also immer über das Standardcenter.

Wenn das iOS eine Applikation in den Hintergrund schickt, verschickt die Applikation eine Benachrichtigung mit dem Typ UIApplicationWillResignActiveNotification. Sie können ein Objekt für den Empfang dieser Benachrichtigung wie folgt anmelden:

NSNotificationCenter *theCenter =Zeilenumbruch
[NSNotificationCenter defaultCenter];

[theCenter addObserver:theObjectZeilenumbruch
selector:@selector(applicationWillResignActive:)Zeilenumbruch
name:UIApplicationWillResignActiveNotificationZeilenumbruch
object:nil];

Listing 5.1 Anmelden eines Benachrichtigungsempfängers

Mit dem Parameter object der Registrierungsmethode können Sie die Benachrichtigungen nach dem Absender filtern. Wenn Sie bei der Registrierung hier einen Absender angeben, erhält der Empfänger nur Benachrichtigungen dieses Senders. Geben Sie hingegen nil (wie in Listing 5.1) an, erhält er alle Nachrichten.

Nach der Registrierung ruft das Notificationcenter immer die Methode applicationWillResignActive: [Dieser Methodenname kollidiert mit der gleichnamigen Methode des Application-Delegates. Sie dürfen diese Methode also nicht dort deklarieren, da die Parametertypen NSNotification und UIApplication miteinander kollidieren.] des Objekts theObject auf, sobald die Applikation die entsprechende Benachrichtigung verschickt. Die Methode hat einen Parameter mit der Klasse NSNotification. Über die Property object dieses Objekts können Sie den Absender der Benachrichtigung ermitteln. Außerdem kann der Absender ein Dictionary mitschicken, das nachrichtenspezifische Werte enthält und auf das Sie über die Property userInfo zugreifen können.

Der kleine Unterschied

Achten Sie bei der Angabe des Selektors auf die richtige Schreibweise des Methodennamens. Gerade bei Methoden mit einem Parameter vergisst man schon mal leicht den Doppelpunkt am Ende. Der Selektor @selector(applicationWillResignActive:) beschreibt eine andere Nachricht als @selector(applicationWillResignActive).

Listing 5.2 enthält ein Beispiel für eine Methode zum Nachrichtenempfang, die den Absender aus der Benachrichtigung ausliest.

- (void)applicationWillResignActive:Zeilenumbruch
(NSNotification *)inNotification {
UIApplication *theApplication = inNotification.object;
...
}

Listing 5.2 Methode zum Empfangen von Benachrichtigungen

Über die Methoden removeObserver:name:object: und removeObserver: können Sie einen Nachrichtenempfänger wieder beim Notificationcenter abmelden. Während Sie mit der ersten Methode einzelne Benachrichtigungen abschalten können, können Sie über die zweite alle Benachrichtigungen eines Empfängers auf einmal abschalten.

Abmelden ist notwendig

Sie müssen jeden Nachrichtenempfänger, zumindest beim manuellen Referenzenzählen, vor seiner Zerstörung beim Notificationcenter abmelden. Andernfalls erzeugen Sie einen Dangling Pointer, was zu einem Programmabsturz führen kann.


Galileo Computing - Zum Seitenanfang

5.1.2 Eigene Benachrichtigungen verschickenZur vorigen Überschrift

Cocoa Touch stellt eine Vielzahl von Benachrichtigungen bereit, die Sie für die Entwicklung Ihrer Apps verwenden können. Sie können allerdings auch aus Ihren Klassen eigene Benachrichtigungen versenden. Beispielsweise könnte das Wecker-Beispielprogramm eine Benachrichtigung bei Alarmauslösung verschicken. Dazu sollten Sie sich zunächst einen Namen ausdenken, der das Ereignis möglichst gut beschreibt, z. B. kAlarmClockHasFiredAlarmNotification. Da jedes beliebige Objekt diese Benachrichtigungen empfangen können soll, deklarieren Sie in der Headerdatei AlarmClockAppDelegate.h folgende Konstante:

extern NSString * const kAlarmClockHasFiredAlarmNotification;

Diese Deklaration sollten Sie in der Headerdatei vor der Klassendeklaration platzieren. In die Implementierungsdatei müssen Sie dann noch die entsprechende Definition einfügen:

NSString * const kAlarmClockHasFiredAlarmNotification =Zeilenumbruch
@"kAlarmClockHasFiredAlarmNotification";

Tipp

Sie sollten für den Namen der Benachrichtigung immer eine Konstante verwenden. Zum einen vermeiden Sie dadurch Fehler aufgrund falsch geschriebener Benachrichtigungsnamen. Außerdem können Sie eventuelle Namenskonflikte sehr einfach beheben.

Aus der Methode application:didReceiveLocalNotification: können Sie jetzt die Benachrichtigung über eine der Methoden postNotification:, postNotificationName:object: oder postNotificationName:object:userInfo: verschicken. Bei der ersten Variante müssen Sie das Benachrichtigungsobjekt selbst erzeugen, während das bei den beiden anderen Varianten jeweils die Methode übernimmt. Im einfachsten Fall verwenden Sie die zweite Methode.

NSNotificationCenter *theCenter =Zeilenumbruch
[NSNotificationCenter defaultCenter];
[theCenter postNotificationName:Zeilenumbruch
kAlarmClockHasFiredAlarmNotification object:self];

Listing 5.3 Verschicken einer einfachen Benachrichtigung

Wenn Sie dagegen auch den Nachrichtentext mit der Benachrichtigung verschicken wollen, sollten Sie die dritte Variante verwenden. Sie können bei ihr über den Parameter userInfo beispielsweise den Nachrichtentext übergeben, den Sie aus der lokalen Benachrichtigung erhalten.

NSNotificationCenter *theCenter =Zeilenumbruch
[NSNotificationCenter defaultCenter];
NSDictionary *theInfo = [NSDictionaryZeilenumbruch
dictionaryWithObjectsAndKeys:inNotification.alertBody, Zeilenumbruch
@"alertBody", nil];
[theCenter postNotificationName:Zeilenumbruch
kAlarmClockHasFiredAlarmNotificationZeilenumbruch
object:self userInfo:theInfo];

Listing 5.4 Verschicken einer Benachrichtigung mit Parametern

NSNotification versus UILocalNotification

Die Benachrichtigungen der Klasse NSNotification aus diesem Kapitel haben bis auf den ähnlichen Namen relativ wenig mit den lokalen Benachrichtigungen der Klasse UILocalNotification aus Kapitel 3 gemeinsam. Die wichtigsten Unterschiede sind folgende:

Eine lokale Benachrichtigung versendet das System zu einem festgelegten Zeitpunkt an die initiierende Applikation. Wenn die Applikation zum Benachrichtigungszeitpunkt nicht läuft, muss sie die Nachricht auch nicht empfangen. Benachrichtigungen können beliebige Objekte innerhalb einer Applikation versenden, und alle registrierten Empfänger empfangen sie.Lokale Benachrichtigungen kann nur das Application-Delegate über die dafür vorgesehene Methode empfangen. Im Gegensatz dazu kann jede Klasse eigene Methoden für den Nachrichtenempfang bereitstellen.Lokale Benachrichtigungen haben keine Typen und können nur eingeschränkte Informationen enthalten. Bei Benachrichtigungen dienen Typen zur Unterscheidung, und sie dürfen nahezu jedes beliebige Objekt mitschicken.Lokale Benachrichtigungen sind persistent. Sie bleiben bis zu ihrer Auslieferung erhalten. Sie bleiben also auch über einen Neustart der App oder des Gerätes hinaus erhalten. Noch nicht ausgelieferte Benachrichtigungen gehen hingegen in diesen Situationen verloren.

Benachrichtigungen können Sie also nur applikationsintern verwenden, aber dort sind sie eine gute Möglichkeit, um mehrere andere Objekte zu informieren. Diese Technik ist eine einfache und sehr elegante Methode, um beliebige Empfänger lose an den Nachrichtensender zu koppeln. Da im MVC-Muster das Modell weder den Controller und schon gar nicht den View kennen sollte, eignen sich Benachrichtigungen hervorragend für die Kommunikation vom Modell zum Controller. In diesem und im nächsten Kapitel bekommen Sie dafür einige Beispiele zu sehen.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.







<< zurück
  Zum Katalog
Zum Katalog: Apps programmieren für iPhone und iPad

Apps programmieren für iPhone und iPad
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Einstieg in Objective-C 2.0 und Cocoa





 Einstieg in
 Objective-C 2.0
 und Cocoa


Zum Katalog: Apps entwickeln für iPhone und iPad - Videotraining






 Apps entwickeln für
 iPhone und iPad -
 Videotraining


Zum Katalog: Apps mit HTML5 und CSS3






 Apps mit HTML5
 und CSS3


Zum Katalog: iPhone- und iPad-Apps entwickeln






 iPhone- und
 iPad-Apps entwickeln


Zum Katalog: Android 4






 Android 4


Zum Katalog: Android-Apps entwickeln - Videotraining






 Android-Apps
 entwickeln -
 Videotraining


Zum Katalog: Windows Store Apps mit XAML und C#






 Windows Store Apps
 mit XAML und C#


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2013
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de