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

Inhaltsverzeichnis
Geleitwort des Gutachters
Vorwort
1 Einführung
2 Einstieg in die Praxis
3 Aufwachen – analoger Wecker
4 Daten, Tabellen und Controller
5 Animationen und Layer
6 Programmieren, aber sicher
7 Jahrmarkt der Nützlichkeiten
A Die Buch-DVD
Stichwort

Download:
- ZIP, ca. 23,6 MB
Buch bestellen
Ihre Meinung?

Spacer
Apps entwickeln für iPhone und iPad von Klaus M. Rodewig, Clemens Wagner
Das Praxisbuch
Buch: Apps entwickeln für iPhone und iPad

Apps entwickeln für iPhone und iPad
geb., mit DVD
515 S., 34,90 Euro
Galileo Computing
ISBN 978-3-8362-1463-6
Pfeil 5 Animationen und Layer
Pfeil 5.1 Modell und Controller
Pfeil 5.1.1 iOS Next Topmodel
Pfeil 5.1.2 View an Controller
Pfeil 5.1.3 Modell an Controller
Pfeil 5.1.4 Undo und Redo
Pfeil 5.1.5 Unittests
Pfeil 5.2 Als die Views das Laufen lernten
Pfeil 5.2.1 Blockfunktionen in C
Pfeil 5.2.2 Animationen mit Blöcken
Pfeil 5.2.3 Transitionen
Pfeil 5.2.4 Zur Animation? Bitte jeder nur einen Block!
Pfeil 5.3 Core Animation
Pfeil 5.3.1 Layer
Pfeil 5.3.2 Vordefinierte Layerklassen
Pfeil 5.3.3 Unser Button soll schöner werden
Pfeil 5.3.4 Spieglein, Spieglein an der Wand
Pfeil 5.3.5 Der bewegte Layer
Pfeil 5.3.6 Der View, der Layer, seine Animation und ihr Liebhaber
Pfeil 5.3.7 Die 3. Dimension
Pfeil 5.4 Der Tabbar-Controller
Pfeil 5.4.1 Aufbau einer Reiternavigation
Pfeil 5.4.2 Für ein paar Controller mehr
Pfeil 5.5 Was Sie schon immer über Instruments wissen wollten, aber nie zu fragen wagten
Pfeil 5.5.1 Spiel mir das Lied vom Leak
Pfeil 5.5.2 Ich folgte einem Zombie
Pfeil 5.5.3 Time Bandits

Galileo Computing - Zum Seitenanfang

5.4 Der Tabbar-ControllerZur nächsten Überschrift

Das Beispielprojekt enthält ein Puzzle- und Memory-Spiel, die jeweils einen eigenen View-Controller haben. Im Gegensatz zum Fototagebuch haben beide Spiele die gleiche Priorität. Ein Navigation-Controller oder modale Dialoge machen für den Spielwechsel also wenig Sinn. Eine Tabbarnavigation, auch Reiternavigation genannt, ist hierfür besser geeignet. Sie verwaltet beliebig viele View-Controller, von denen sie aber immer nur einen anzeigen kann. Über die Tabbar können Sie den View-Controller für die Anzeige auswählen. Dabei stellt die Tabbar für jeden View-Controller ein beschriftetes Icon dar.

Abbildung

Abbildung 5.19 Eine Tabbar mit vier Einträgen


Galileo Computing - Zum Seitenanfang

5.4.1 Aufbau einer ReiternavigationZur nächsten ÜberschriftZur vorigen Überschrift

Sie können eine Tabbarnavigation über die Klasse UITabBarController erzeugen. Das geht am einfachsten über den Interface Builder, in dem Sie das entsprechende Symbol aus der Palette in die Baumdarstellung einer XIB-Datei ziehen. Sie können dann weitere View-Controller auf diesen Tabbar-Controller ziehen. Wenn Sie den Baum des Controllers aufklappen, können Sie die enthaltenen View-Controller sehen (siehe Abbildung 5.20). Außerdem ermöglicht Ihnen diese Ansicht, die View-Controller umzuordnen und zu konfigurieren.

Wer mit wem?

Sie dürfen in einen Tabbar-Controller fast alle anderen View-Controller einfügen und einen Tabbar-Controller auch als modalen Dialog anzeigen. Andererseits unterstützt iOS aber keine Tabbar-Controller in Navigation-Controllern.

Abbildung

Abbildung 5.20 Baumdarstellung eines Tabbar-Controllers

Beim Einfügen eines View-Controllers in einen Tabbar-Controller legt der Interface Builder automatisch ein Objekt der Klasse UITabBarItem unterhalb des View-Controllers an, auf das Sie über die Property tabBarItem vom View-Controller aus zugreifen können. Über dieses Element legen Sie das Icon und die Beschriftung des View-Controllers in der Tabbar fest. Dabei verwendet auch dieses Icon nur den Alphawert des Bildes für die Anzeige. Außerdem können Sie über dieses Element die Beschriftung der Plakette (Badge) bestimmen. Die Plakette ist der rote Kreis mit der 3 in Abbildung 5.19.

Die Games-App verwendet eine Plakette, um die Anzahl der neuen Highscores anzuzeigen. Sie können die angezeigte Zeichenkette der Plakette über die Property badgeValue des Tabbar-Elements setzen. Wenn Sie keine Plakette anzeigen möchten, müssen Sie die Property auf nil setzen. Wenn Sie stattdessen eine leere Zeichenkette verwenden, zeigt der Tabbareintrag eine leere Plakette an.

Bei jeder Speicherung eines neuen Highscore-Wertes erhöht die Methode saveScore: den Wert in der Plakette.

UITabBarItem *theItem = self.highscoreItem;
NSString *theValue = [NSString stringWithFormat:@"%d",
[theItem.badgeValue intValue] + 1];
theItem.badgeValue = theValue;

Listing 5.54 Aktualisierung der Plakette


Galileo Computing - Zum Seitenanfang

5.4.2 Für ein paar Controller mehrZur vorigen Überschrift

Ein Tabbar-Controller kann beliebig viele View-Controller enthalten, aber die Tabbar kann nur maximal fünf Einträge nebeneinander anzeigen. Bei sechs und mehr Controllern verwendet der Tabbar-Controller einen zusätzlichen Navigation-Controller mit eingebettetem Tableview-Controller. Darüber können Sie auf die restlichen View-Controller zugreifen. Die Tabbar verwendet in diesem Fall den Platz für den fünften Tabbar-Eintrag für die Anzeige des Mehr-Eintrags, der zu diesem Tableview-Controller führt. Diese Struktur stellt Abbildung 5.21 dar.

Der Tableview des Mehr-Eintrags listet alle View-Controller auf, die keinen Platz in der Tabbar gefunden haben. Wenn Sie einen View-Controller aus der Tabelle auswählen, zeigt ihn der Tabbar-Controller über den Navigation-Controller an.

Die Auslagerung der Einträge aus der Tabbar in den Tableview geschieht dabei vollkommen automatisch. [23](Das gilt aber nur für die App. Der Interface Builder quetscht alle Tabbar-Einträge nebeneinander.) Sie haben dafür also keinen zusätzlichen Aufwand. Andererseits können Sie die Anzeige des Mehr-Eintrags nicht unterdrücken oder bei weniger als sechs Viewcontrollern erzwingen.

Abbildung

Abbildung 5.21 Struktur des Tabbar-Controllers

Anpassungsfähige View-Controller

Die ersten vier Views des Tabbar-Controllers bekommen eine größere Anzeigehöhe als die Views aus dem Tableview für die Mehr-Einträge. Da diese Einträge ein Navigation-Controller anzeigt, haben sie wegen der Navigationsleiste eine geringere Höhe. Sie sollten bei der Erstellung darauf achten, da der Tabbar-Controller eine Neuanordnung seiner Elemente erlaubt. Die Views der eingebetteten View-Controller sollten sich also an die unterschiedlichen Höhen anpassen können, was Sie in der Regel durch die Anpassung der Autoresizing-Masken Ihrer Views erreichen. Der Tabbar-Controller achtet aber auf Navigation-Controller bei den Mehr-Einträgen. Wenn Sie einen Navigation-Controller aus dem Tableview aufrufen, schiebt der Tabbar-Controller dessen Wurzel-Controller auf seinen Navigation-Controller. Dadurch kann es nicht passieren, dass Sie einen Navigation-Controller auf einen anderen schieben.

Über den Button Bearbeiten in der Navigationsleiste gelangen Sie zu einer Ansicht, mit der Sie die Einträge in der Tabbar anpassen können. Diese Ansicht zeigt alle Tabbar-Einträge. Sie können jeden Eintrag auf die Tabbar ziehen und dadurch deren Einträge neu festlegen (siehe Abbildung 5.22).

Abbildung

Abbildung 5.22 Bearbeiten der Tabbar

Der Tabbar-Controller speichert diese neue Anordnung aber nicht permanent ab. Das Programm More auf der beiliegenden DVD demonstriert ein Vorgehen, um die Anordnung der Tabbar-Einträge in den Nutzereinstellungen zu speichern. Dazu weist es jedem Viewcontroller eine fortlaufende Nummer zu. Wenn Sie die Viewcontroller umordnen, verändern Sie die Reihenfolge dieser Nummern. Das Programm speichert diese Reihenfolge ab und kann beim Neustart daraus die Anordnung der Viewcontroller wieder herstellen.

Zur Ablage der Indexwerte in den Viewcontrollern verwendet die App die Property tag der Tabbar-Einträge. Nach dem Laden des Tabbar-Controllers aus der NIB-Datei weist sie zunächst den Tabbar-Einträgen die Indexwerte zu. Dazu verwendet die Methode application:didFinishLaunchingWithOptions: eine Blockfunktion zusammen mit einer entsprechenden Methode von NSArray.

NSArray *theControllers = self.tabBarController.viewControllers;
[theControllers enumerateObjectsUsingBlock:
^(id inController, NSUInteger inIndex, BOOL *outStop) {
[[inController tabBarItem] setTag:inIndex];
}];

Listing 5.55 Nummerierung der Tabbar-Einträge

Nach jeder Änderung der Tabbar-Einträge soll die App die neue Reihenfolge abspeichern. Das erfolgt über die User-Defaults und die Delegatemethode tabBarController:willEndCustomizingViewControllers:changed: des Tabbar-Controllers.

Programmeinstellungen sichern

In den User-Defaults können Sie Ihre Daten wie in einem Dictionary ablegen. Sie speichern sie im Gegensatz zum Dictionary aber permanent ab, sodass sie nach einem Neustart der App wieder zur Verfügung stehen.

Listing 5.56 enthält die Implementierung. Da Sie nur bei einer Änderung der Reihenfolge die Werte speichern müssen, überprüft die Methode den Wert des Parameters change. Über die Key-Value-Coding-Methode valueForKeyPath: erzeugt die Methode das Array mit den Viewcontroller-Positionswerten.

- (void)tabBarController:(UITabBarController *)inController willEndCustomizingViewControllers:(NSArray *)inControllers changed:(BOOL)inChanged {
if(inChanged) {
NSArray *theIndexes =
[inControllers valueForKeyPath:@"tabBarItem.tag"];
NSUserDefaults *theDefaults =
[NSUserDefaults standardUserDefaults];
[theDefaults setObject:theIndexes forKey:@"tabBarItems"];
[theDefaults synchronize];
}
}

Listing 5.56 Abspeichern der Reihenfolge in den User-Defaults

Jetzt fehlt nur der Code zur Wiederherstellung der Reihenfolge in der Tabbar. Das übernimmt die Methode restoreTabBar, die Sie in Listing 5.57 sehen. Sie liest zuerst die Indexwerte aus den User-Defaults. Die Schleife durchquert die Viewcontroller in der Reihenfolge der Indexwerte aus dem Tabbar-Controller und fügt sie in ein veränderliches Array ein. Schließlich weist sie dieses Array dem Tabbar-Controller zu.

- (void)restoreTabBar {
NSUserDefaults *theDefaults =
[NSUserDefaults standardUserDefaults];
NSArray *theIndexes =
[theDefaults arrayForKey:@"tabBarItems"];
NSArray *theViewControllers =
self.tabBarController.viewControllers;
if(theIndexes.count == theViewControllers.count) {
NSMutableArray *theControllers =
[NSMutableArray arrayWithCapacity:theIndexes.count];
for(NSNumber *theIndex in theIndexes) {
NSUInteger theValue = theIndex.unsignedIntValue;
[theControllers addObject:
[theViewControllers objectAtIndex:theValue]];
}
self.tabBarController.viewControllers = theControllers;
}
}

Listing 5.57 Wiederherstellung der Reihenfolge in der Tabbar

Die If-Abfrage in Listing 5.57 wirkt auf den ersten Blick überflüssig. Sie vermeidet aber zwei Probleme. Beim ersten Start existieren noch keine Indexwerte in den User-Defaults. Ohne diese Abfrage erhielte der Tabbar-Controller ein leeres Array, da der Schleifenblock nicht ausgeführt wurde. Dadurch würde auch die Tabbar leer bleiben.

Ein ähnlicher Effekt kann bei einer Aktualisierung Ihrer App auftreten, bei der Sie die Tabbar erweitern oder verkürzen. Bei einer Erweiterung würden Viewcontroller herausfallen, und eine Verkürzung hätte einen Fehler mit Programmabsturz zur Folge.



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 entwickeln für iPhone und iPad





Apps entwickeln für iPhone und iPad
Jetzt bestellen


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

 Buchempfehlungen
Objective-C 2.0 & Cocoa





 Objective-C 2.0
 Cocoa


Zum Katalog: Mac OS X Lion






 Mac OS X Lion


Zum Katalog: Mac OS X und UNIX






 Mac OS X
 und UNIX


Zum Katalog: Android 3






 Android 3


Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Katalog: CSS






 CSS


Zum Katalog: jQuery






 jQuery


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Galileo Press 2011
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