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 4 Alles unter Kontrolle
Pfeil 4.1 Viewcontroller, XIBs und Storyboards
Pfeil 4.1.1 Erstellung von Viewcontrollern über XIB-Dateien
Pfeil 4.1.2 Applikationsinitialisierung
Pfeil 4.1.3 Storyboards
Pfeil 4.1.4 Modale Dialoge
Pfeil 4.1.5 Pop-over
Pfeil 4.1.6 Übergänge
Pfeil 4.2 Der Navigationcontroller
Pfeil 4.2.1 Viewcontroller anzeigen und entfernen
Pfeil 4.2.2 Die Navigationsleiste
Pfeil 4.2.3 Der Zurückbutton
Pfeil 4.2.4 Gehe drei Felder zurück
Pfeil 4.2.5 Die Werkzeugleiste
Pfeil 4.2.6 Navigations- und Werkzeugleisten gestalten
Pfeil 4.3 Navigation- und Pop-over-Controller in der Praxis
Pfeil 4.3.1 Navigationcontroller anlegen
Pfeil 4.3.2 Einen Dialog für die Einstellungen gestalten
Pfeil 4.3.3 Einstellungen dauerhaft speichern
Pfeil 4.3.4 Anpassung an das iPad
Pfeil 4.4 Der Splitviewcontroller
Pfeil 4.4.1 Das Splitviewcontroller-Delegate
Pfeil 4.4.2 Ein praktisches Beispiel
Pfeil 4.4.3 Anpassung des Rotationsverhaltens
Pfeil 4.5 Der Tabbarcontroller
Pfeil 4.5.1 Aufbau einer Reiternavigation
Pfeil 4.5.2 Plaketten
Pfeil 4.5.3 Für ein paar Controller mehr
Pfeil 4.5.4 Der Tabbarcontroller im Storyboard
Pfeil 4.5.5 Die Gestaltungsmöglichkeiten für die Tabbar unter iOS 5
Pfeil 4.6 Der Pageviewcontroller
Pfeil 4.6.1 Einen Pageviewcontroller erzeugen
Pfeil 4.6.2 Die Datenquelle und das Delegate
Pfeil 4.7 Eigene Container- und Subviewcontroller
Pfeil 4.7.1 Container- und Subviewcontroller
Pfeil 4.7.2 Eigene Subviewcontroller
Pfeil 4.7.3 Eigene Delegate-Protokolle erstellen
Pfeil 4.7.4 Delegate-Protokolle erweitern
Pfeil 4.8 Regelbasierte Anpassung der Oberfläche
Pfeil 4.8.1 Gestaltungsregeln ...
Pfeil 4.8.2 ... und Gestaltungsmöglichkeiten

Galileo Computing - Zum Seitenanfang

4.5 Der TabbarcontrollerZur nächsten Überschrift

Viele Apps enthalten mehrere Viewcontroller, die untereinander keine Hierarchie haben. Es wäre also wünschenswert, sie gleichberechtigt nebeneinander liegen zu haben. Sie können natürlich einen Viewcontroller erstellen, der einen Button für jeden Viewcontroller besitzt. Wenn der Nutzer den Button drückt, zeigt die Applikation den Viewcontroller als modalen Dialog oder über einen Navigationcontroller an. Dieses Vorgehen hat allerdings für den Nutzer den Nachteil, dass er bei einem Controllerwechsel immer zuerst zu der Ansicht mit den Buttons zurückkehren muss. Ein direkter Wechsel ist so nur sehr schwer möglich.

Ein Navigationcontroller oder modale Dialoge machen für den Wechsel also wenig Sinn. Eine Tabbarnavigation, auch Reiternavigation genannt, ist hierfür besser geeignet. Sie verwaltet beliebig viele Viewcontroller, von denen sie jedoch immer nur einen anzeigen kann. Über die Tabbar können Sie den Viewcontroller für die Anzeige auswählen. Dabei stellt die Tabbar für jeden Viewcontroller ein beschriftetes Icon dar. In Abbildung 4.35 können Sie ein Beispiel für eine Tabbar sehen. Sie gehört zum Beispielprojekt Games aus Kapitel 6, »Models, Layer, Animationen«.

Abbildung

Abbildung 4.35 Eine Tabbar mit vier Einträgen


Galileo Computing - Zum Seitenanfang

4.5.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, indem Sie das entsprechende Symbol aus der Palette in die Baumdarstellung einer XIB-Datei ziehen. Sie können dann weitere Viewcontroller auf diesen Tabbarcontroller ziehen. Wenn Sie den Baum des Controllers aufklappen, können Sie die enthaltenen Viewcontroller sehen (siehe Abbildung 4.36). Außerdem ermöglicht Ihnen diese Ansicht, die Viewcontroller umzuordnen und zu konfigurieren.

Abbildung

Abbildung 4.36 Baumdarstellung eines Tabbarcontrollers

Die Viewcontroller innerhalb des Tabbarcontrollers konfigurieren Sie in gewohnter Weise, indem Sie ihnen über den Identitätsinspektor eine Klasse und über den Attributinspektor ein XIB zuweisen. Die Erstellung einer Tabbarnavigation in einem Storyboard unterscheidet sich etwas von der in XIB-Dateien. Auch hier legen Sie einen Tabbarcontroller an; im Gegensatz zu den XIBs ziehen Sie die enthaltenen Viewcontroller hingegen nicht auf den Tabbarcontroller. Stattdessen legen Sie sie auf der Arbeitsfläche des Storyboards ab und ziehen eine Verbindung vom Tabbarcontroller zum Viewcontroller und wählen den Punkt view controllers im Pop-over-Menü aus. In Abbildung 4.37 sehen Sie eine Tabbarcontroller-Szene in einem Storyboard. Sie können die Reihenfolge der Einträge nur über die Tabbar des Tabbarcontrollers im Interface Builder anpassen, indem Sie dort die Einträge mit der Maus verschieben.

Abbildung

Abbildung 4.37 Eine Tabbarcontroller-Szene in einem Storyboard

Beim Einfügen eines Viewcontrollers in einen Tabbarcontroller legt der Interface Builder automatisch ein Objekt der Klasse UITabBarItem unterhalb des Viewcontrollers an, auf das Sie über die Property tabBarItem des eingefügten Viewcontrollers aus zugreifen können. Über dieses Element legen Sie das Icon und die Beschriftung des Viewcontrollers in der Tabbar fest. 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 4.35.

Tabbaricons

Die Icons in der Tabbar verwenden, analog zu den Buttons in der Navigations- und Werkzeugleiste, nur die Alphamaske des Bildes für die Anzeige. Die Icons sind im unselektierten Zustand weiß, und im selektierten Zustand sind sie standardmäßig blau. Dabei können Sie über die Höhe des Alphawertes die Intensität festlegen. Es sind also Grau- beziehungsweise Blaustufenbilder.

Über das Delegate des Tabbarcontrollers können Sie die Controllerauswahl beinflussen beziehungsweise sich darüber informieren lassen. Der Tabbarcontroller fragt das Delegate über die Methode tabBarController:shouldSelectViewController:, ob er den angegebenen Viewcontroller anzeigen darf. Sie können das unterbinden, indem Sie NO zurückgeben. Nach der Anzeige eines Viewcontrollers ruft der Tabbarcontroller die Delegate-Methode tabBarController:didSelectViewController: auf.

Die Tabbar

Der Tabbarcontroller verwendet einen View der Klasse UITabBar, um die Tabbar darzustellen. Sie dürfen diese Tabbar jedoch nicht über deren Methoden manipulieren oder deren Delegate verändern. Stattdessen sollten Sie die Methoden des Controllers verwenden.


Galileo Computing - Zum Seitenanfang

4.5.2 PlakettenZur nächsten ÜberschriftZur vorigen Überschrift

Viele Apps verwenden Plaketten (Badges), um auf Neuigkeiten in den Tabs hinzuweisen. Sie können den angezeigten Wert der Plakette über die Property badgeValue der Klasse UITabBarItem setzen. Anders als beim Applikationsicon können Sie der Plakette eines Tabbareintrags auch eine (sehr) kurze Zeichenkette übergeben, die diese auch klaglos anzeigt. Wenn Sie keine Plakette anzeigen möchten, müssen Sie den Wert nil verwenden. Übergeben Sie stattdessen eine leere Zeichenkette, zeigt der Tabbareintrag auch eine leere Plakette an. Listing 4.39 enthält ein Beispiel, wie ein Viewcontroller einen numerischen Wert in seine eigene Plakette setzen kann. Dazu müssen Sie die Zahl in eine Zeichenkette umwandeln. Den Wert 0 ändern Sie jedoch in nil, um die Plakette zu löschen.

NSUInteger theBadgeValue = ...;
NSString *theValue = theBadgeValue == 0 ? nil :
[NSString stringWithFormat:@"%d", theBadgeValue];
self.tabBarItem.badgeValue = theValue;

Listing 4.39 Aktualisierung der Plakette

Das Beispielprojekt Games in Kapitel 6 verwendet die Plakette eines Tabbareintrags, um die Anzahl neuer Highscores anzuzeigen.


Galileo Computing - Zum Seitenanfang

4.5.3 Für ein paar Controller mehrZur nächsten ÜberschriftZur vorigen Überschrift

Ein Tabbarcontroller kann beliebig viele Viewcontroller enthalten; die Tabbar kann hingegen nur maximal fünf Einträge nebeneinander anzeigen. Bei sechs und mehr Controllern verwendet der Tabbarcontroller einen zusätzlichen Navigationcontroller mit eingebettetem Tableviewcontroller. Darüber können Sie auf die restlichen Viewcontroller zugreifen. Die Tabbar verwendet in diesem Fall den Platz für den fünften Tabbareintrag zur Anzeige des Mehreintrags, der zu diesem Tableviewcontroller führt. Abbildung 4.38 stellt diese Struktur dar.

Abbildung

Abbildung 4.38 Struktur des Tabbarcontrollers

Der Tableview des Mehreintrags listet alle Tabbarelemente der Viewcontroller auf, die keinen Platz in der Tabbar gefunden haben. Wenn Sie einen Viewcontroller aus der Tabelle auswählen, zeigt ihn der Tabbarcontroller an, indem er ihn auf den Navigationcontroller schiebt.

Die Auslagerung der Einträge aus der Tabbar in den Tableview geschieht dabei vollkommen automatisch. [ Das gilt jedoch nur für die App; der Interface Builder quetscht alle Tabbareinträge nebeneinander, bis sie Sardinen in einer Dose ähneln.] 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.

Anpassungsfähige Viewcontroller

Die ersten vier Views des Tabbarcontrollers bekommen eine größere Anzeigehöhe als die Views aus dem Tableview für die Mehr-Einträge. Da ein Navigationcontroller diese Einträge anzeigt, haben sie wegen der Navigationsleiste eine geringere Höhe. Sie sollten bei der Erstellung darauf achten, da der Tabbarcontroller eine Neuanordnung seiner Elemente erlaubt.

Die Views der eingebetteten Viewcontroller sollten sich also an die unterschiedlichen Höhen anpassen können, was Sie in der Regel durch die Anpassung der Autosizingmasken oder des Autolayouts Ihrer Views erreichen. Auf die automatische Größenanpassung von Views gehen wir in Kapitel 5, »Daten, Tabellen und Controller«, noch genauer ein.

Der Tabbarcontroller achtet allerdings auf Navigationcontroller bei den Mehreinträgen. Wenn Sie einen Navigationcontroller aus dem Tableview des Mehreintrags aufrufen, schiebt der Tabbarcontroller dessen Wurzelcontroller auf seinen Navigationcontroller. Der Tabbarcontroller ignoriert also diesen Navigationcontroller des Tabbareintrags und verwendet stattdessen den Navigationcontroller des Mehreintrags. Dadurch kann es nicht passieren, dass Sie einen Navigationcontroller 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 Tabbareinträge. Sie können jeden Eintrag auf die Tabbar ziehen und dadurch deren Einträge neu festlegen (siehe Abbildung 4.39).

Abbildung

Abbildung 4.39 Bearbeiten der Tabbar

Der Tabbarcontroller speichert diese neue Anordnung allerdings nicht permanent ab. Das Beispielprojekt More auf der beiliegenden DVD demonstriert ein Vorgehen, um die Anordnung der Tabbareinträ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 in den Userdefaults ab und kann beim Neustart daraus die Anordnung der Viewcontroller wiederherstellen.

Projektinformation

Den Quellcode des nachfolgenden Beispielprojekts finden Sie auf der DVD unter Code/Apps/More als XIB-Version und unter Code/Apps/Storyboard/More als Storyboard-Version. Außerdem finden Sie es im Github-Repository zum Buch in den Unterverzeichnissen https://github.com/Cocoaneheads/iPhone/tree/Auflage_2/Apps/More beziehungsweise https://github.com/Cocoaneheads/iPhone/tree/Auflage_2/Apps/Storyboard/More.

Zur Ablage der Indexwerte in den Viewcontrollern verwendet die App die Property tag der Tabbareinträge. Nach dem Laden des Tabbarcontrollers aus der NIB-Datei weist sie zunächst den Tabbareinträgen die Indexwerte zu. Dazu iteriert die Methode application:didFinishLaunchingWithOptions: über die Controller. Danach kann die App die Reihenfolge der Controller wiederherstellen, was in der Methode restoreTabBar geschieht:

NSArray *theControllers =
self.tabBarController.viewControllers;
NSUInteger theIndex = 0;

for (UIViewController *theController in theControllers) {
theController.tabBarItem.tag = theIndex++;
}
[self restoreTabBar];

Listing 4.40 Nummerierung der Tabbareinträge

Nach jeder Änderung der Tabbareinträge soll die App die neue Reihenfolge in den Userdefaults abspeichern. Das erfolgt über die Delegate-Methode tabBarController:willEndCustomizingViewControllers:changed: des Tabbarcontrollers, deren Implementierung Listing 4.41 enthält. 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. Das Array theIndexes enthält also die Werte der Tags der Tabbarelemente in der aktuellen Reihenfolge der Tabbar. Dabei sind die Arraye-Elemente allerdings Objekte der Klasse NSNumber, da die Instanzen von NSArray keine einfachen Datentypen wie int oder NSInteger direkt speichern können.

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

Listing 4.41 Abspeichern der Reihenfolge in den Userdefaults

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

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

[theControllers addObject:Zeilenumbruch
[theViewControllers objectAtIndex:theValue]];
}
self.tabBarController.viewControllers =
theControllers;
}
}

Listing 4.42 Wiederherstellung der Reihenfolge in der Tabbar

Die if-Abfrage in Listing 4.42 wirkt auf den ersten Blick überflüssig; sie vermeidet jedoch zwei Probleme. Beim ersten Start existieren noch keine Indexwerte in den Userdefaults, und ohne diese Abfrage erhielte der Tabbarcontroller ein leeres Array, da die Methode den Schleifenblock deswegen nicht ausführt. Dadurch würde somit 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.


Galileo Computing - Zum Seitenanfang

4.5.4 Der Tabbarcontroller im StoryboardZur nächsten ÜberschriftZur vorigen Überschrift

NIB-basierte Apps verwenden in der Regel das Application-Delegate auch als Delegate des Tabbarcontrollers, und die Zuweisung geschieht in der Datei MainWindow.xib, wenn sie beide Objekte enthält. In Storyboards ist das hingegen nicht möglich, da sie das Application-Delegate nicht enthalten. Sie können das Delegate-Outlet des Tabbarcontrollers auch nicht mit einem anderen Viewcontroller verbinden, selbst wenn dieser das Protokoll UITabBarControllerDelegate implementiert, da jede Storyboard-Szene nur einen Viewcontroller enthält.

In einem Storyboard können Sie also dem Tabbarcontroller kein Delegate über ein Outlet, sondern nur über Ihren Programmcode zuweisen. Das ist relativ einfach, wenn der Tabbarcontroller der initiale Viewcontroller in dem Storyboard ist. Hier können Sie sich den Tabbarcontroller über die Property rootViewController des Fensters holen. In der More-App für das Storyboard finden Sie dazu den entsprechenden Code in der Methode application:didFinishLaunchingWithOptions:.

self.tabBarController = (UITabBarController *)
self.window.rootViewController;
self.tabBarController.delegate = self;

Listing 4.43 Delegate des Tabbarcontrollers setzen

In Listing 4.43 sehen Sie, dass Sie die Zuweisung gegenüber NIB-basierten Anwendungen sozusagen umdrehen müssen. Dort weisen Sie der Property rootViewController des Fensters den Tabbarcontroller zu. Bei einem Storyboard holen Sie den Tabbarcontroller von dort und weisen ihn Ihrer Property tabBarController zu. Diesem Objekt können Sie dann ein Delegate zuweisen. Übrigens funktioniert das natürlich auch bei den Delegates für die anderen Containerviewcontroller-Klassen, wenn sie jeweils die initialen Viewcontroller des Storyboards sind.

Wenn der Tabbarcontroller nicht der initiale Controller in seinem Storyboard ist, funktioniert diese Zuweisung nicht, weil das Fenster ja auf einen anderen Rootviewcontroller verweist. Hier müssen Sie das Delegate setzen, bevor Sie den Tabbarcontroller anzeigen. Wenn Sie dafür einen Übergang verwenden, ist die Methode prepareForSegue:sender: der richtige Platz. Listing 4.44 setzt das Application-Delegate als Delegate des Tabbarcontrollers in dieser Methode.

- (void)prepareForSegue:(UIStoryboardSegue *)inSegue
sender:(id)inSender {
if([inSegue.destinationViewController
isKindOfClass:[UITabBarController class]) {
id theDelegate =
[[UIApplication sharedApplication] delegate];

[inSegue.destinationViewController
setDelegate:theDelegate];
}
}

Listing 4.44 Delegate des Tabbarcontrollers bei einem Übergang setzen

Sie müssen jedoch nicht das Application-Delegate als Delegate des Tabbarcontrollers verwenden. Häufig kann es sogar viel sinnvoller sein, den aktuellen Controller dafür zu nutzen. Das funktioniert auch für beliebige Controller, sodass Sie die Prüfung auf die Klasse durch eine Abfrage, ob der Zielcontroller ein Delegate besitzt, ersetzen können. Listing 4.45 setzt den aktuellen Controller als Delegate des neuen, wenn dieser Delegation unterstützt und noch kein Delegate besitzt.

- (void)prepareForSegue:(UIStoryboardSegue *)inSegue
sender:(id)inSender {
id theController = inSegue.destinationViewController;

if([theController respondsToSelector:@selector(delegate)]
&& [theController delegate] == nil) {
[theController setDelegate:self];
}
}

Listing 4.45 Setzen des Delegates für beliebige Controller

Die Implementierung in Listing 4.45 schließt aus der Existenz des Getters delegate auf die Existenz des Setters setDelegate:. Das ist zwar in den meisten Fällen richtig, muss allerdings nicht immer zutreffen. In diesem Fall sollten Sie die Bedingung in der if-Abfrage durch die Bedingung [theController respondsToSelector:@selector(setDelegate:)] weiter einschränken.


Galileo Computing - Zum Seitenanfang

4.5.5 Die Gestaltungsmöglichkeiten für die Tabbar unter iOS 5Zur vorigen Überschrift

Ab iOS 5 können Sie die Tabbar stärker an Ihre Designvorstellungen anpassen. Dabei können Sie die Farbe des ausgewählten Tabbaritems über die Einstellung Image Tint im Attributinspektor der Tabbar festlegen. Dort lässt sich auch die Farbe der Tabbar unter Tint einstellen. Mit dieser Einstellung legen Sie eine einheitliche Auswahlfarbe für alle Buttons fest. Die nicht ausgewählten Buttons bleiben grau.

Wenn Sie eine Tabbar mit beliebigen Icons wollen, können Sie über die Methode setFinishedSelectedImage:withFinishedUnselectedImage: jeweils ein Bild für den selektierten und den unselektierten Zustand des Elements setzen. Dabei verwendet die Tabbar jedoch nicht nur die Alphamaske, sondern das komplette Bild für die Darstellung. Über die Property backgroundImage der Klasse UITabBar können Sie auch der Tabbar ein Bild als Hintergrund setzen.



Ihr Kommentar

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

>> Zum Feedback-Formular
<< 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