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.4 Der SplitviewcontrollerZur nächsten Überschrift

Das iPad bietet gegenüber dem iPhone eine circa fünfmal größere Anzeigefläche, die für die alleinige Darstellung einzelner Dialoge häufig zu groß ist. Beispielsweise ist die Fläche, die der Einstellungsdialog unserer Wecker-App benötigt, für den iPad-Bildschirm viel zu klein.

Das iPad bietet mit dem Splitviewcontroller die Möglichkeit, im Querformat die Views von zwei Viewcontrollern nebeneinander anzuzeigen. Da der linke Viewcontroller in der Regel den Inhalt des rechten festlegt, nennt Apple den linken Master- und den rechten Detailviewcontroller. Im Hochformat zeigt der Splitviewcontroller den Detailviewcontroller auf der kompletten Bildschirmfläche und den Masterviewcontroller optional in einem Pop-over an (siehe Abbildung 4.32). Damit das funktioniert, müssen beide Controller sowohl das Quer- als auch das Hochformat unterstützen. Für die Anzeige und die Steuerung des Pop-overs sollte der Detailviewcontroller außerdem eine Werkzeugleiste für den Button bieten, die in der Regel nicht zu einem Navigationcontroller gehört und am oberen Bildschirmrand liegt.

Master-Detail

Die Aufteilung in Master-Detail finden Sie bei Apple häufiger. Dabei zeigt der Master eine Übersicht oder die Struktur der Daten an, während die Detailansicht ein einzelnes Datenobjekt darstellt. Ein typisches Beispiel ist die Mail-App auf dem iPad, wo der Master die Postfächer beziehungsweise die Mails auflistet und die Detailansicht den Inhalt einer Mail anzeigt.

Abbildung

Abbildung 4.32 Splitviewcontroller im Hoch- und Querformat

Die Klasse UISplitViewController besitzt eine minimalistische Schnittstelle, die nur zwei Propertys enthält. Über viewControllers können Sie die beiden enthaltenen Viewcontroller in einem Array abfragen beziehungsweise festlegen. Dabei ist der erste Controller im Array der Master- und der zweite der Detailviewcontroller. Über die zweite Property bestimmen Sie das Delegate des Splitviewcontrollers.


Galileo Computing - Zum Seitenanfang

4.4.1 Das Splitviewcontroller-DelegateZur nächsten ÜberschriftZur vorigen Überschrift

Das Delegate bietet drei optionale Methoden an, die Sie über Anzeigeereignisse des Masterviewcontrollers informieren. Der Splitviewcontroller ruft splitViewController:popoverController:willPresentViewController: auf, bevor er den Master im übergebenen Pop-over-Controller anzeigt. Wenn der Splitviewcontroller in das Querformat wechselt, ruft er splitViewController:willShowViewController:invalidatingBarButtonItem: auf und beim Wechsel in das Hochformat splitViewController:willHideViewController:withBarButtonItem:forPopoverController:.

Der Splitviewcontroller verwaltet jedoch nicht nur die beiden Viewcontroller für Sie, sondern auch den Pop-over-Viewcontroller und den Button für dessen Anzeige. Über die beiden letztgenannten Delegate-Methoden brauchen Sie nur die Anzeige des jeweils übergebenen Buttons verwalten, um den Pop-over-Viewcontroller anzeigen zu können. Die einfachste Möglichkeit dafür ist eine Toolbar, in die Sie den Button einfügen beziehungsweise aus der Sie den Button entfernen.

- (void)splitViewController:Zeilenumbruch
(UISplitViewController*)inSplitViewControllerZeilenumbruch
willHideViewController:(UIViewController *)inMasterZeilenumbruch
withBarButtonItem:(UIBarButtonItem*)inButtonZeilenumbruch
forPopoverController:(UIPopoverController*)inPopover {
NSMutableArray *theItems = [NSMutableArray Zeilenumbruch
arrayWithArray:self.toolbar.items mutableCopy];

inButton.title = ...;
[theItems insertObject:inButton atIndex:0];Zeilenumbruch
[self.toolbar setItems:theItems animated:YES];
self.popoverController = inPopover;
}

Listing 4.30 Anzeige des Buttons für den Pop-over-Controller

Listing 4.30 enthält den Programmcode zur Anzeige des Buttons, über den Sie den Pop-over-Controller anzeigen lassen können. Wenn der Splitviewcontroller ins Querformat wechselt, müssen Sie den Button wieder aus der Werkzeugleiste entfernen. Dazu können Sie die zuletzt genannte Delegate-Methode verwenden. Den dafür notwendigen Programmcode finden Sie in Listing 4.31.

- (void)splitViewController:Zeilenumbruch
(UISplitViewController*)inSplitViewControllerZeilenumbruch
willShowViewController:(UIViewController *)inViewController Zeilenumbruch
invalidatingBarButtonItem:(UIBarButtonItem *)inButton { Zeilenumbruch
NSMutableArray *theItems = [NSMutableArray Zeilenumbruch
arrayWithArray:self.toolbar.items];

[theItems removeObjectAtIndex:0];
[self.toolbar setItems:theItems animated:YES];
self.popoverController = nil;
}

Listing 4.31 Den Button für den Pop-over-Controller aus der Werkzeugleiste entfernen

Die Werkzeugleiste im Splitviewcontroller

Der Splitviewcontroller geht davon aus, dass Sie eine Werkzeugleiste für den Button zum Öffnen des Pop-overs bereitstellen. Sie müssen diese Leiste indes nicht über einen Navigationcontroller verwalten, und sie muss auch nicht am unteren Bildschirmrand beheimatet sein. Apple platziert sie auch gerne am oberen Rand, sodass sie wie eine Navigationsleiste aussieht.


Galileo Computing - Zum Seitenanfang

4.4.2 Ein praktisches BeispielZur nächsten ÜberschriftZur vorigen Überschrift

Die gute alte Wecker-App soll natürlich auch nicht vom Splitviewcontroller verschont bleiben. Die Umstellung lässt sich leicht bewerkstelligen. Auch hier sollten Sie zunächst die App für eine Sprache anpassen und danach die anderen Sprachen nachziehen.

Für die Umstellung öffnen Sie als Erstes das Storyboard der Sprache, mit der Sie beginnen möchten. Dort legen Sie einen Splitviewcontroller an, indem Sie das entsprechende Symbol aus der Bibliothek auf die Zeichenfläche ziehen. Der Interface Builder zeigt darauf vier neue Viewcontroller-Objekte auf der Zeichenfläche an (siehe Abbildung 4.33): neben dem Splitviewcontroller einen Navigationcontroller für den Master mit einem Tableviewcontroller als Wurzel. Außerdem legt er für die Detailansicht einen gewöhnlichen Viewcontroller an. Sie benötigen für den analogen Wecker allerdings nur den Splitview und den Navigationcontroller; löschen Sie also die beiden anderen Controller.

Abbildung

Abbildung 4.33 Ein Splitviewcontroller; frisch geschlüpft...

Die gelöschten Controller müssen Sie nun durch die bestehenden Controller ersetzen, damit der Splitviewcontroller seine Arbeit aufnehmen kann. Ziehen Sie dazu zunächst eine Verbindung vom Splitviewcontroller zu dem in Abschnitt 4.3.1 angelegten Navigationcontroller, und wählen Sie im Pop-over-Dialog den Eintrag detail view controller und Relationship Segue aus. Außerdem weisen Sie dem Navigationcontroller des Masters den Viewcontroller für die Einstellungen als neuen Rootviewcontroller zu, indem Sie eine entsprechende Verbindung ziehen. Danach legen Sie noch den Splitviewcontroller als neuen initialen Viewcontroller des Storyboards über das Feld Is Initial View Controller in dessen Attributinspektor fest und schließen damit die Arbeiten am Storyboard ab. Die endgültige Struktur der Viewcontroller im Storyboard sehen Sie in Abbildung 4.34.

Abbildung

Abbildung 4.34 ...und nach der Umstellung

Die geänderte Applikation zeigt den Einstellungsdialog und die Zeitanzeige nun in einem Splitview an, wenn Sie sie auf dem iPad oder im Simulator ausführen.

Unerreichbare Viewcontroller

Durch die Umstellung ist die navigationsbasierte Version des Weckers jedoch nicht verloren gegangen. Sie können sie reaktivieren, indem Sie den Navigationcontroller wieder als initialen Viewcontroller festlegen. Allerdings gibt Xcode dann die Warnung Scene is unreachable due to lack of entry points and does not have an identifier for runtime access via -instantiateViewControllerWithIdentifier: aus, und die App zeigt einen schwarzen Bildschirm mit leerer Navigationsleiste an. Die Applikation muss alle Viewcontroller in einem Storyboard erreichen können. Dazu gehören neben dem initialen Viewcontroller auch alle mit einer Kennung. Außerdem sind alle Controller erreichbar, die sich über Verbindungen von den erreichbaren Controllern aus erreichen lassen. In Abbildung 4.34 gehören dazu beispielsweise der Alarmclock- und Preferencesviewcontroller, die zwar weder initial sind noch eine Kennung haben, sich jedoch über Verbindungen vom Splitviewcontroller aus erreichen lassen.

Wenn Sie nun den Navigationcontroller als initialen Viewcontroller festlegen, ist der Splitviewcontroller für die Applikation nicht mehr erreichbar. Dieser Fehler lässt sich allerdings relativ einfach beseitigen; weisen Sie dem Splitviewcontroller im Identitätsinspektor unter Storyboard ID einfach eine eindeutige Kennung zu. Für Cocoa Touch ist hierbei also nur die Erreichbarkeit entscheidend; ob die Applikation den Controller tatsächlich verwendet, ist irrelevant.

Von dem Splitviewcontroller bekommen Sie aber jetzt noch nicht viel zu sehen, da Ihre Applikation momentan nur eine Ausrichtung des Views unterstützt.


Galileo Computing - Zum Seitenanfang

4.4.3 Anpassung des RotationsverhaltensZur vorigen Überschrift

Damit der Splitviewcontroller auch richtig zur Geltung kommen kann, sollte die Applikation auf einem iPad ihren View auch für andere Geräteausrichtungen als das Hochformat anpassen. Bei allen anderen Konfigurationen [iPhone und iPad ohne Splitviewcontroller] soll sie den View immer im Hochformat anzeigen. Dabei können Sie über die Pro3perty splitViewController der Klasse UIViewController den Splitviewcontroller erhalten, in dem sich der entsprechende Viewcontroller befindet; die Property liefert natürlich nil, wenn er nicht in einem Splitviewcontroller liegt. Bis iOS 5 können Sie über die Methode shouldAutorotateToInterfaceOrientation: festlegen, welche Viewausrichtungen ein Viewcontroller unterstützt:

- (BOOL)shouldAutorotateToInterfaceOrientation:Zeilenumbruch
(UIInterfaceOrientation)inOrientation {

return inOrientation == UIInterfaceOrientationPortrait || Zeilenumbruch
self.splitViewController != nil;
}

Listing 4.32 Unterstützte Viewausrichtungen dynamisch festlegen

Die Methode liefert YES, wenn der View des Controllers die angegebene Ausrichtung unterstützt, und ansonsten NO. Um das Ergebnis zu ermitteln, gibt es zum einen für jede Ausrichtung jeweils eine Konstante UIInterfaceOrientationPortrait, -PortraitUpsideDown, -LandscapeLeft und -LandscapeRight. Außerdem gibt es noch die beiden Makros UIInterfaceOrientationIsPortrait() und UIInterfaceOrientationIsLandscape(), mit denen Sie einen Wert auf Hoch- beziehungsweise Querformat prüfen können.

shouldAutorotateToInterfaceOrientation: und iOS 6

Apple hat die Methode shouldAutorotateToInterfaceOrientation: ab iOS 6 als veraltet markiert. Sie dürfen sie aber trotzdem auch weiterhin verwenden. Außerdem hat Apple ihr Verhalten geändert. Vor iOS 6 ruft Cocoa Touch diese Methode gegebenenfalls mehrmals bei jeder Gerätedrehung auf, um die unterstützten Ausrichtungen zu erfahren. Ab iOS 6 fragt es hingegen jede Ausrichtung nur einmal ab und merkt sich die unterstützten Ausrichtungen. Über diese Methode können Sie also ab iOS 6 die unterstützten Viewausrichtungen zur Laufzeit nur einmal festlegen.

Ab iOS 6 gibt es neue Methoden, um die unterstützten Viewausrichtungen festzulegen. Das können Sie entweder für jeden Viewcontroller über die Methoden shouldAutorotate und supportedInterfaceOrientations getrennt festlegen, oder Sie wählen den zentralen Weg über application:supportedInterfaceOrientationsForWindow: des Application-Delegate. Die Methode shouldAutorotate legt dabei fest, ob sich der View des Controllers an die Geräteausrichtung anpassen soll. Wenn diese Methode NO liefert, dreht sich der View also nicht mit.

Das Beispielprojekt verwendet den zentralen Ansatz:

- (NSUInteger)application:(UIApplication *)inApplication Zeilenumbruch
supportedInterfaceOrientationsForWindow:Zeilenumbruch
(UIWindow *)inWindow {
return [inWindow.rootViewController Zeilenumbruch
isKindOfClass:[UISplitViewController class]3] ? Zeilenumbruch
UIInterfaceOrientationMaskAll : Zeilenumbruch
UIInterfaceOrientationMaskPortrait;
}

Listing 4.33 Unterstützte Viewausrichtungen zentral festlegen

Die Methoden supportedInterfaceOrientations und application:supportedInterfaceOrientationsForWindow: liefern dabei jeweils eine Bitmaske mit den unterstützten Viewausrichtungen, für die es jeweils eine Konstante gibt. Sie können mehrere Ausrichtungen in den Rückgabewert über den Operator für das bitweise Oder | kodieren; beispielsweise lassen sich beide Hochformate durch

UIInterfaceOrientationMaskPortrait | Zeilenumbruch
UIInterfaceOrientationMaskPortraitUpsideDown

ausdrücken. Außerdem gibt es für alle Ausrichtungen noch die Konstante UIInterfaceOrientationMaskAll.

Die Navigationsleiste über dem Ziffernblatt zeigt allerdings immer noch den Button zum Öffnen der Einstellungen an, der nach wie vor funktioniert. Bei einem Splitviewcontroller ist er jedoch unnötig. Sie können den Button zwar im Storyboard löschen, aber dann funktioniert die Variante mit dem Navigationcontroller nicht mehr einwandfrei. Alternativ lässt sich der Button auch über den Programmcode ausschalten, indem Sie ihn aus dem Navigation-Item des Controllers löschen. In Listing 4.34 sehen Sie den entsprechenden Code, den Sie in die Methode viewDidLoad des Alarmclockviewcontrollers einfügen.

if(self.splitViewController != nil) {
self.NavigationItem.rightBarButtonItem = nil;
}

Listing 4.34 Entfernen Sie den Button bei Verwendung eines Splitviews.

Damit der Nutzer den Einstellungsdialog auch im Hochformat sehen kann, sollten Sie nun noch die Delegate-Methoden des Splitviewcontrollers implementieren. Als Delegate verwenden Sie dabei den Alarmclockviewcontroller. Damit er auch alle Delegate-Aufrufe des Splitviewcontrollers mitbekommt, erfolgt die Zuordnung in seiner awakeFromNib-Methode:

- (void)awakeFromNib {
[super awakeFromNib];
self.splitViewController.delegate = self;
}

Listing 4.35 Alarmviewcontroller als Splitviewcontrollerdelegate festlegen

Den Button zum Öffnen des Pop-overs zeigen Sie in der Toolbar des Navigationcontrollers im Detailview an. Diese Toolbar soll aber nur im Hochformat erscheinen, da der Platz im Querformat ansonsten zu klein ist. Die Anzeige können Sie über die Methode willRotateToInterfaceOrientation: steuern; dabei steuert die Hilfsmethode updateToolbarForInterfaceOrientation: die Anzeige.

- (void)updateToolbarForInterfaceOrientation:Zeilenumbruch
(UIInterfaceOrientation)inInterfaceOrientation {
if(self.splitViewController) {
[self.navigationController setToolbarHidden:Zeilenumbruch
UIInterfaceOrientationIsLandscape(Zeilenumbruch
inInterfaceOrientation) Zeilenumbruch
animated:YES];
}
}
- (void)willRotateToInterfaceOrientation:Zeilenumbruch
(UIInterfaceOrientation)inOrientation Zeilenumbruch
duration:(NSTimeInterval)inDuration {
[self updateToolbarForInterfaceOrientation:inOrientation];
}

Listing 4.36 Aktualisierung der Werkzeugleiste bei Gerätedrehungen

Der Viewcontroller ruft willRotateToInterfaceOrientation: allerdings nicht auf, wenn er auf dem Bildschirm erscheint, weshalb die Werkzeugleiste fehlt, wenn Sie die Applikation im Hochformat starten. Diesen Fehler können Sie jedoch leicht beheben, indem Sie die Methode updateToolbarForInterfaceOrientation: in viewDidAppear: aufrufen. Dabei können Sie die aktuelle Ausrichtung des Vie9ws über die Property interfaceOrientation des Viewcontrollers erfragen. Die entsprechende Änderung sehen Sie in Listing 4.37.

- (void)viewDidAppear:(BOOL)inAnimated {
[super viewDidAppear:inAnimated];

...
[self updateToolbarForInterfaceOrientation:Zeilenumbruch
self.interfaceOrientation];
}

Listing 4.37 Werkzeugleiste bei Erscheinen des Controllers aktualisieren

Mit diesen Änderungen sollte die Applikation auf einem iPad immer im Hochformat eine Werkzeugleiste anzeigen und im Querformat nicht. Die Implementierungen der beiden Delegate-Methoden fallen dagegen sehr kurz aus; Sie übergeben den Button zu den Toolbar-Items beziehungsweise entfernen ihn daraus. Außerdem legen Sie einen Titel für den Button fest.

- (void)splitViewController:Zeilenumbruch
(UISplitViewController *)inSplitViewController Zeilenumbruch
willHideViewController:Zeilenumbruch
(UIViewController *)inViewController Zeilenumbruch
withBarButtonItem:(UIBarButtonItem *)inBarButtonItem Zeilenumbruch
forPopoverController:Zeilenumbruch
(UIPopoverController *)inPopoverController {
inBarButtonItem.title = Zeilenumbruch
NSLocalizedString(@"Preferences", @"Preferences");
self.toolbarItems = @[inBarButtonItem];
}

- (void)splitViewController:Zeilenumbruch
(UISplitViewController *)inSplitViewController Zeilenumbruch
willShowViewController:Zeilenumbruch
(UIViewController *)inViewController Zeilenumbruch
invalidatingBarButtonItem:Zeilenumbruch
(UIBarButtonItem *)inBarButtonItem {
self.toolbarItems = @[];
}

Listing 4.38 Aktualisierung des Buttons in der Werkzeugleiste

Eieruhr

Durch die Rotation ändert auch der Clockview seine Größe und das Seitenverhältnis, sodass er nicht mehr quadratisch ist. Dadurch stellt die Applikation im Querformat ein elliptisches Ziffernblatt dar. In Kapitel 5, »Daten, Tabellen und Controller«, lernen Sie eine Möglichkeit kennen, wie Sie diese Verzerrung vermeiden können.



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