4.7 Eigene Container- und Subviewcontroller
![]()
In diesem Kapitel haben Sie bereits mehrere Containerviewcontroller wie beispielsweise den Splitview- oder den Tabbarcontroller kennengelernt. Daneben sind natürlich auch noch viele andere Containerviewcontroller denkbar. Dieser Abschnitt zeigt Ihnen, wie Sie eigene Containerviewcontroller verwirklichen können.
4.7.1 Container- und Subviewcontroller

Mit iOS 5 hat Apple die Klasse UIViewController um mehrere Methoden erweitert, die Ihnen eine nahezu beliebige Verschachtelung der Views Ihrer Viewcontroller erlauben. Es gibt zwei wesentliche Anwendungsfälle, in denen diese neuen Methoden zum Einsatz kommen:
- Containerviewcontroller zeigen einen oder mehrere andere Viewcontroller an und organisieren den Wechsel zwischen diesen Controllern. Das iOS stellt beispielsweise mit dem Splitview-, Navigation- und Tabbarcontroller auch Containerviewcontroller bereit.
- Ein Subview mit eigenem Controller belegt nur einen Teil der Bildschirmfläche. Ihn fügt entweder der Controller des Haupviews ein, wie das bei presentViewController:animated:completion: auf dem iPad und der Darstellungsart UIModalPresentationPageSheet geschieht. Alternativ kann sich ein Subviewcontroller auch selbstständig in den Hauptview einklinken, wie das der Pop-over-Viewcontroller macht.
Projektinformation
Den Quellcode des nachfolgenden Beispielprojekts finden Sie auf der DVD unter Code/Apps/Storyboard/Container oder im Github-Repository zum Buch im Unterverzeichnis https://github.com/Cocoaneheads/iPhone/tree/Auflage_2/Apps/Storyboard/Container.
Das Vorgehen für Containerviewcontroller und Subviews mit Controllern ist sehr ähnlich. Sie fügen den inneren Controller über die Methode addChildViewController: zum äußeren hinzu. Außerdem fügen Sie den View des inneren Controllers an einer beliebigen Stelle in den View des äußeren ein. Nach Abschluss aller Operationen senden Sie an den inneren Controller noch die Nachricht didMoveToParentViewController: mit dem äußeren Viewcontroller als Argument.
Die Klasse RaisingSegue setzt genau diese Schritte um; sie implementiert die Methode perform, die den neuen Subview von links unten aufzieht. Da Kapitel 6, »Models, Layer, Animationen«, genauer auf Animationen und Blockfunktionen eingeht, gibt Listing 4.50 nur eine verkürzte Version ohne Animation wieder. Den vollständigen Quellcode mit Animationen finden Sie auf der DVD.
- (void)perform {
UIViewController *theFromViewController =
self.sourceViewController;
UIViewController *theToViewController =
self.destinationViewController;
CGRect theBounds = theFromViewController.view.bounds;
UIView *theView = theToViewController.view;
UIView *theBackgroundView =
[[UIView alloc] initWithFrame:theBounds];
[theFromViewControllerð
addChildViewController:theToViewController];
theBackgroundView.backgroundColor =ð
[UIColor colorWithWhite:0.0 alpha:0.5];
theBackgroundView.autoresizingMask =ð
UIViewAutoresizingFlexibleWidth |ð
UIViewAutoresizingFlexibleHeight;
[theBackgroundView addSubview:theView];
[theFromViewController.view addSubview:theBackgroundView];
theView.frame = CGRectInset(theBounds, 20.0, 20.0);
[theToViewControllerð
didMoveToParentViewController:theFromViewController];
}
Listing 4.50 Einfügen eines Subviews mit eigenem Controller
Die Implementierung belegt für den Subview hingegen nicht die komplette Fläche des Hauptviews, sondern nur ein kleineres Rechteck. Um die UI-Elemente außerhalb des Subviews zu sperren, legt der Übergang den Subview in einen View mit schwarz-transparenter Hintergrundfarbe. Diese Farbgebung bewirkt ein Ausgrauen des Hintergrunds, also des Hauptviews, und zeigt so dem Nutzer die Sperrung an.
Das Beispielprogramm lässt den Subviewcontroller über die Actionmethode close der Klasse SupernumeraryViewController wieder verschwinden. Während Sie nach dem Erscheinen des Subviews die Methode didMoveToParentViewController: des Controllers aufrufen müssen, müssen Sie vor dem Verschwinden die Methode willMoveToParentViewController: aufrufen. Diese beiden Methoden können Sie verwenden, damit Ihre Subviewcontroller auf das Einfügen und das Entfernen reagieren können. Das Einfügen und Entfernen können Sie dabei anhand des Parameters unterscheiden, der beim Entfernen nil ist.
Bewegungen zum Parentviewcontroller
Beim Anzeigen oder Verschwinden eines eingebetteten Controllers empfängt dieser immer die beiden Nachrichten willMoveToParentViewController: und didMoveToParentViewController:. Dabei müssen Sie allerdings nur die zweite Methode explizit mit dem Parentviewcontroller aufrufen (siehe Listing 4.50), wenn Sie den Subview anzeigen. Umgekehrt rufen Sie nur die erste Methode explizit mit dem Parameter nil auf (siehe Listing 4.51), wenn Sie den Subview verschwinden lassen. Der andere Methodenaufruf erfolgt dabei jeweils implizit durch Cocoa Touch, und Sie brauchen sich darum nicht zu kümmern.
Die Klasse des Subviewcontrollers darf übrigens beide Methoden überschreiben, um auf diese Ereignisse reagieren zu können. Dabei sollten die überschreibenden Methoden natürlich immer die entsprechende Methode in der Oberklasse aufrufen. Sie können diese Methoden beispielsweise als Ersatz für die Methoden des Anzeigezyklus (z. B. viewWillAppear:) verwenden.
Nach dem expliziten Aufruf von willMoveToParentViewController: können Sie den Subview aus der Viewhierarchie über die Methode removeFromSuperview entfernen und die Operation durch removeFromParentViewController abschließen. Den kompletten Code ohne die Anweisungen für die Animation finden Sie in Listing 4.51.
- (IBAction)close {
UIViewController *theToViewController = 
self.parentViewController;
CGRect theBounds = theToViewController.view.bounds;
UIView *theView = self.view;
UIView *theBackgroundView = theView.superview;
[self willMoveToParentViewController:nil];
[theBackgroundView removeFromSuperview];
[theView removeFromSuperview];
[self removeFromParentViewController];
}
Listing 4.51 Subviewcontroller entfernen
Die Klasse ContainerViewController des Beispielprojekts zeigt vier Subviews an, die jeweils ein eigener Viewcontroller verwaltet. Dabei fügt sie die Subviewcontroller analog zu Listing 4.50 hinzu. Die vier Subviews haben dabei alle die gleiche Größe und sind in jeweils zwei Reihen und Spalten angeordnet. Die Größe und Position könnte der Containerviewcontroller natürlich schon beim Einfügen der Subviews festlegen. Allerdings wäre dieses Vorgehen relativ unflexibel bei Größenveränderungen oder Rotationen des Containerviews. Sinnvoller ist ein dynamisches Layout.
Dazu können Sie die Methode viewDidLayoutSubviews im Controller des Containers überschreiben. Cocoa Touch ruft diese Methode nach jeder Größenänderung seines Views auf. Die Klasse ContainerViewController des Beispielprojekts nutzt diese Methode, um die Views entsprechend anzuordnen.
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
CGRect theBounds = self.containerView.bounds;
CGRect theFrame = CGRectMake(0.0, 0.0,
CGRectGetWidth(theBounds) / 2.0,
CGRectGetHeight(theBounds) / 2.0);
NSUInteger theIndex = 0;
for(UIViewController *theController in
self.viewControllers) {
UIView *theView = theController.view;
NSUInteger theColumn = theIndex % 2;
NSUInteger theRow = theIndex / 2;
theFrame.origin.x = theColumn * theFrame.size.width;
theFrame.origin.y = theRow * theFrame.size.height;
theView.frame = theFrame;
theIndex++;
}
}
Listing 4.52 Layout der Subviews über den Containerviewcontroller
Verwaltung der Subviewcontroller
Wenn Sie einen Controller auf die beschriebene Art zu einem anderen Viewcontroller hinzufügen, erhält er automatisch alle Nachrichten über Viewrotationen. Sie können also beispielsweise die Methode didRotateFromInterfaceOrientation: wie gewohnt verwenden. Außerdem leitet der Parentviewcontroller die Nachrichten des Anzeigezyklus – wie beispielsweise viewWillAppear: – an die Subviewcontroller weiter. Im Beispielprogramm enthalten diese Methoden Log-Anweisungen, sodass Sie das leicht mitverfolgen können.
Allerdings ruft Cocoa Touch diese Methoden nicht unbedingt so auf, wie Sie es brauchen. Es kann ja schließlich nicht wissen, ob ein neuer Subview einen bestehenden verdrängt oder ob beide Subviews gleichzeitig sichtbar sind. Aus diesem Grund können Sie diese Nachrichten auch selbst an die Subviewcontroller verschicken.
Unter iOS 5 können Sie das Standardverhalten durch Überschreiben der Methode automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers im äußeren Viewcontroller abschalten, indem Ihre Implementierung einfach NO zurückgibt. Diese Methode hat Apple allerdings mit iOS 6 schon wieder als veraltet markiert.
Unter iOS 6 gibt es stattdessen zwei neue Methoden, über die Sie die Weiterleitungen für die Rotation und das Erscheinen getrennt steuern können. Die Methoden shouldAutomaticallyForwardRotationMethods und shouldAutomaticallyForwardAppearanceMethods liefern standardmäßig YES zurück. Sie können diese Methoden überschreiben, um die Weiterleitung der Nachrichten zu erleichtern.
Unter iOS 6 können Sie die Nachrichten für das Erscheinen und Verschwinden des Subviews über die Methoden beginAppearanceTransition:animated: und endAppearanceTranssition versenden. Dabei rufen Sie beginAppearanceTransition:animated: des Subviewcontrollers auf, bevor Sie den Subview in den Containerview einfügen oder ihn daraus entfernen. Um welche Operation es sich handelt, legen Sie jeweils über den ersten Parameter fest; YES bedeutet Erscheinen und NO Verschwinden. Wenn Sie alle Anweisungen für die Änderung abgeschlossen haben, rufen Sie endAppearanceTransition auf. Die Animation der Klasse RaisingSegue können Sie beispielsweise folgendermaßen in diese Methoden kapseln:
[theFromViewController beginAppearanceTranssition:YES
animated:YES];
UIView animateWithDuration:1.0
animations:^{
theBackgroundView.alpha = 1.0;
theView.transform = CGAffineTransformIdentity;
}
completion:^(BOOL inFinished) {
[theToViewController didMoveToParentViewController:
theFromViewController];
[theFromViewController endAppearanceTranssition];
}];
Listing 4.53 Versenden der Nachrichten zum Erscheinen des Subviews
Allerdings sind diese Aufrufe in dem Übergang nicht sinnvoll, da er ja nicht das automatische Weiterleiten der Ereignisse abschalten kann.
Containerviews leicht gemacht
Mit iOS 6 ermöglicht Apple die Verwaltung von Containerviews direkt im Interface Builder. Dazu ziehen Sie einen Containerview aus der Bibliothek (siehe Abbildung 4.41) auf den View auf der Zeichenfläche, in den Sie den Viewcontroller einbetten möchten.
Abbildung 4.41 Containerview in der Objektbibliothek
Der Interface Builder stellt den Containerview über ein hellgraues Rechteck dar und legt automatisch einen neuen Viewcontroller an, den ein Übergang mit dem Containerview verbindet. Sie können diese Verbindung ändern, indem Sie sie auf die übliche Weise vom Containerview zum gewünschten Viewcontroller neu ziehen. Dadurch lassen sich beliebige Viewcontroller in einem Containerview anzeigen.
Abbildung 4.42 Containerview im Storyboard
4.7.2 Eigene Subviewcontroller

Wenn Sie den View eines Viewcontrollers anzeigen möchten, dann geschieht das über die Controllerschicht. Sie haben dafür bereits einige Möglichkeiten kennengelernt. Den Viewcontroller des Startviews Ihrer App legen Sie beispielsweise über die Property rootViewController der Klasse UIWindow fest. Dialoge können Sie auf dem iPhone über presentViewController:animated:completion: anzeigen und auf dem iPad auch über Pop-over-Controller.
Viewcontroller und die Verwaltung von Subviews
Die Views der Unterklassen von UIViewController sollten Sie immer über die Controllerschicht anzeigen lassen (z. B. als modalen Dialog). Bei iOS-Versionen vor 5 sollten Sie diese Views nicht selber direkt über addSubview: oder insertSubview-Methoden in die Viewhierarchie einfügen. Dieses Vorgehen ist unsauber, da dadurch Cocoa Touch beispielsweise die Methoden des Anzeigezyklus des Subviewcontrollers nicht aufruft.
Die einzige Ausnahme bildete vor iOS 4 der Rootviewcontroller, dessen View direkt zum Fenster hinzugefügt wurde. Mit der Einführung der Property rootViewController der Klasse UIWindow in iOS 4 ist jedoch auch das nicht mehr nötig.
Ein Viewcontroller verwaltet immer den kompletten View, der an ihm hängt. Es gibt allerdings auch häufig Fälle, in denen Sie eine feinere Unterteilung haben möchten. Ein typisches Beispiel sind Subviews, die Sie in unterschiedlichen Hauptviews verwenden möchten. Für die Verwaltung solcher Subviews sollten Sie vor iOS 5 keine Unterklassen von UIViewController verwenden. Sie können dafür hingegen einfach Unterklassen von NSObject erstellen.
Projektinformation
Den Quellcode des nachfolgenden Beispielprojekts finden Sie auf der DVD unter Code/Apps/Subview oder im Github-Repository zum Buch im Unterverzeichnis https://github.com/Cocoaneheads/iPhone/tree/Auflage_2/Apps/Subview.
Das Beispielprogramm enthält die Basisklasse SubviewController für die Anzeige und Verwaltung von Subviews. Dabei stellt sie den Subview im oberen Bereich des Hauptviews dar und graut diesen durch einen Hintergrundview aus. Sie ahmt über die Propertys view und nibName sowie die Methode loadView den Lademechanismus der Klasse UIViewController nach (siehe Listing 4.54). Sie können den View des Subviewcontrollers jedoch auch über dessen Outlet view setzen.
- (NSString *)nibName {
if(nibName == nil) {
self.nibName = NSStringFromClass([self class]);
}
return nibName;
}
- (UIView *)view {
if(view == nil) {
[self loadView];
}
return view;
}
- (void)loadView {
NSBundle *theBundle = [NSBundle mainBundle];
[theBundle loadNibNamed:self.nibName
owner:self options:nil];
[self viewDidLoad];
}
Listing 4.54 View-Lademechanismus für Subviewcontroller
Der Controller implementiert die beiden Propertys als Lazy-Getter, wobei er für den Namen der NIB-Datei den Namen der Controller-Klasse zurückgibt, wenn Sie keinen Namen gesetzt haben. Die Methode loadView lädt die NIB-Datei über die Methode loadNibNamed:owner:options: der Klasse NSBundle. Dabei verwendet sie den Controller als Eigentümer. In dieser Datei sollten Sie das Outlet view des File’s Owners auf einen beliebigen View setzen. Dann setzt dieser Methodenaufruf implizit den View des Controllers.
Das Beispielprogramm enthält die Unterklasse LoginSubviewController von SubviewController, die einen Logindialog als Subview anzeigt. In Abbildung 4.43 können Sie den Inhalt von dessen XIB-Datei sehen.
Abbildung 4.43 Die Verbindungen des Subviewcontrollers
Der Subviewcontroller besitzt die nicht-haltende Property viewController, die auf den Viewcontroller des Hauptviews verweist und die er zum Einfügen des Subviews braucht. Beim Einfügen legt er den Subview in einen weiteren View, der einerseits die Views des Hauptviews ausgraut und andererseits verhindert, dass der Hauptview Touchevents erhält. Für diesen Hintergrund erzeugt der Controller einen schwarz-transparenten View, der die Fläche des Hauptviews hat.
- (UIView *)backgroundViewWithFrame:(CGRect)inFrame
forView:(UIView *)inView {
if(inView == nil) {
NSLog(@"Error: Outlet view is not set for %@.", self);
return nil;
}
else {
CGRect theFrame = inView.frame;
UIView *theBackgroundView =
[[UIView alloc] initWithFrame:inFrame];
theFrame.origin.x = (CGRectGetWidth(inFrame) –
CGRectGetWidth(theFrame)) / 2.0;
theFrame.origin.y = (CGRectGetHeight(inFrame) –
CGRectGetHeight(theFrame)) / 3.0;
theBackgroundView.backgroundColor =
[UIColor colorWithWhite:0.0 alpha:0.75];
[theBackgroundView addSubview:inView];
inView.frame = theFrame;
return theBackgroundView;
}
}
Listing 4.55 Erzeugung des Hintergrundes
Der Controller steuert die Sichtbarkeit des Subviews, indem er ihn mit dem Hintergrund in den Hauptview einfügt beziehungsweise aus diesem entfernt. Sie steuern die Sichtbarkeit des Subviews über die Property visible des Subviewcontrollers. Dabei ruft der Setter auch die Benachrichtigungsmethoden subviewWillAppear und subviewWillDisappear auf. Diese haben eine leere Implementierung und sind die Gegenstücke zu den Viewcontroller-Methoden viewWillAppear: beziehungsweise viewWillDisappear:.
- (BOOL)visible {
return view.superview != nil;
}
- (void)setVisible:(BOOL)inVisible {
if(inVisible != self.visible) {
if(inVisible) {
UIView *theMainView = self.viewController.view;
UIView *theView = [self backgroundViewWithFrame:
theMainView.bounds forView:self.view];
[self subviewWillAppear];
[theMainView addSubview:theView];
}
else {
UIView *theView = self.view;
[self subviewWillDisappear];
[theView.superview removeFromSuperview];
[theView removeFromSuperview];
}
}
}
Listing 4.56 Die Sichtbarkeit des Subviews steuern
Den Subviewcontroller legen Sie an, indem Sie in der XIB-Datei des Viewcontrollers einen orangefarbenen Würfel aus der Bibliothek in die linke Seitenleiste und dort in die Rubrik Objects ziehen. Diesem Objekt weisen Sie über dessen Identitätsinspektor die Klasse LoginSubviewViewController zu und verbinden dessen Outlet viewController mit dem File’s Owner der XIB-Datei. Außerdem sollte dieser das Objekt halten, was Sie über eine Outlet-Property loginSubviewController mit dem Speicherverwaltungstyp retain des Viewcontrollers erreichen. Diese Verbindungen können Sie in Abbildung 4.44 sehen. Der Viewcontroller kann nun über beispielsweise eine Actionmethode den Subview anzeigen:
- (IBAction)showLogin:(id)inSender {
self.loginSubviewController.visible = YES;
}
Listing 4.57 Anzeige des Subviews über den Viewcontroller
Abbildung 4.44 Der Subviewcontroller im XIB des Viewcontrollers
4.7.3 Eigene Delegate-Protokolle erstellen

Die meisten Viewcontroller in Cocoa Touch besitzen ein eigenes Delegate-Protokoll. Da Delegation die Flexibilität einer Klasse wesentlich erhöhen kann, soll der Subviewcontroller auch ein Protokoll und eine entsprechende Property dafür erhalten. Da sowohl das Protokoll die Klasse als auch die Klasse das Protokoll kennen muss, müssen Sie vor der Klassendeklaration eine Vorwärtsdeklaration für das Protokoll einfügen. Die Vorwärtsdeklaration teilt dem Compiler mit, dass es ein Protokoll mit dem angegebenen Namen gibt. Dadurch können Sie das Protokoll in Deklarationen verwenden, ohne dass es zu Übersetzungsfehlern kommt, und Sie können damit die Delegate-Property hinzufügen:
@protocol SubviewControllerDelegate;
@interface SubviewController : NSObject
@property(nonatomic, assign) IBOutlet
id<SubviewControllerDelegate> delegate;
// weitere Deklarationen
@end
Listing 4.58 Deklaration der Delegate-Property
Das Protokoll enthält zwei Methoden, die der Subviewcontroller vor dem Ein- beziehungsweise Ausblenden des Subviews aufruft. Das Protokoll deklariert beide Methoden als optional, sodass das Delegate sie nicht implementieren muss. Die Deklaration aus Listing 4.59 folgt auf die Deklaration der Klasse SubviewController in der Datei SubviewController.h.
@protocol SubviewControllerDelegate<NSObject>
@optional
- (void)subviewControllerWillAppear:
(SubviewController *)inController;
- (void)subviewControllerWillDisappear:
(SubviewController *)inController;
@end
Listing 4.59 Deklaration des Delegate-Protokolls
Der Aufruf der Delegate-Methoden erfolgt aus der Methode setVisible: (siehe Listing 4.56) heraus. Listing 4.60 enthält die Änderungen gegenüber der ursprünglichen Methode, wobei der Übersichtlichkeit halber einige Zeilen ausgelassen wurden.
- (void)setVisible:(BOOL)inVisible {
if(inVisible != self.visible) {
if(inVisible) {
// Code ausgelassen
[theMainView addSubview:theView];
if([self.delegate respondsToSelector:
@selector(subviewControllerWillAppear:)]) {
[self.delegate 
subviewControllerWillAppear:self];
}
}
else {
// Code ausgelassen
[theView removeFromSuperview];
if([self.delegate respondsToSelector:
@selector(subviewControllerWillDisappear:)]) {
[self.delegate
subviewControllerWillDisappear:self];
}
}
}
}
Listing 4.60 Aufruf der Delegate-Methoden
Da das Delegate die Methoden nicht implementieren muss, muss der Controller vor deren Aufruf ihre Existenz überprüfen. Das geschieht über die Methode respondsToSelector:. Sie können nun in der XIB-Datei des Viewcontrollers dem Subviewcontroller den Viewcontroller als Delegate zuweisen, wenn der Viewcontroller das Delegate-Protokoll implementiert.
4.7.4 Delegate-Protokolle erweitern
Die Klasse LoginSubviewController ist eine Unterklasse von SubviewController und benötigt zusätzliche Delegate-Methoden. Dazu müssen Sie das Protokoll SubviewControllerDelegate erweitern und die Delegate-Property in der Unterklasse spezialisieren. Damit das funktioniert, müssen Sie das Protokoll des Logincontrollers vor dessen Klasse deklarieren. Da das Protokoll allerdings auch die Klasse LoginSubviewController kennt, müssen Sie diesmal eine Vorwärtsdeklaration für die Klasse erstellen.
@class LoginSubviewController;
@protocol LoginSubviewControllerDelegate
<SubviewControllerDelegate>
- (void)loginSubviewController:
(LoginSubviewController *)inController
loginWithUser:(NSString *)inUser
password:(NSString *)inPass;
@optional
- (void)loginSubviewControllerDidCancel:
(LoginSubviewController *)inController;
@end
@interface LoginSubviewController :
SubviewController<UITextFieldDelegate>
@property(nonatomic, assign) IBOutlet
id<LoginSubviewControllerDelegate> delegate;
@end
Listing 4.61 Erweiterung des Delegate-Protokolls des Subviewcontrollers
Property-Typen spezialisieren
Die Klasse LoginSubviewController redeklariert die Property delegate ihrer Oberklasse. Das ist hier möglich, weil das Protokoll LoginSubviewControllerDelegate ein Unterprotokoll von SubviewControllerDelegate ist. Der Compiler muss bei der Redeklaration der Property diesen Zusammenhang allerdings kennen, damit er keinen Fehler ausgibt. Deswegen muss, wie es in Listing 4.61 geschehen ist, die Protokolldeklaration vor der Klassendeklaration erfolgen.
Die Implementierung der Delegate-Property übernimmt ja nach wie vor die Klasse SubviewController. Trotzdem warnt der Compiler Sie, dass er keine Accessoren dafür finden kann. Sie müssen also den Compiler darauf hinweisen, dass es bereits eine Implementierung gibt. Das können Sie über die Anweisung @dynamic delegate; in der Implementierung der Klasse LoginSubviewController erreichen.
Der Logincontroller kann nur die Delegate-Methoden in den entsprechenden Actionmethoden aufrufen. Da die Methode loginSubviewController:loginWithUser:password: obligatorisch ist, brauchen Sie nicht zu überprüfen, ob sie existiert, bevor Sie sie aufrufen.
- (IBAction)cancel {
self.visible = NO;
if([self.delegate respondsToSelector:
@selector(loginSubviewControllerDidCancel:)]) {
[self.delegate loginSubviewControllerDidCancel:self];
}
}
- (IBAction)login {
self.visible = NO;
[self.delegate loginSubviewController:self
loginWithUser:self.loginField.text
password:self.passwordField.text];
}
Listing 4.62 Aufruf der Delegate-Methoden des Logincontrollers
Phishing leicht gemacht
Die Implementierungen der Delegate-Methoden schreiben jeweils eine passende Ausgabe ins Log. Dabei gibt die Methode loginSubviewController:loginWithUser:password: auch den Login-Namen und das Passwort aus. Bei dieser Beispielapplikation ist das nicht schlimm. Sie sollten das hingegen nie bei einer produktiven App machen, da ein Angreifer das Log ohne großen technischen Aufwand auslesen kann. Das ist also eine ernst zu nehmende Sicherheitslücke.
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.








Jetzt bestellen





