View-Controller: Wie programmgesteuert zwischen Ansichten wechseln?
Kurz: ich will zwei Vollbild-Ansichten, wo ich Umschalten kann zwischen Ansicht A und Ansicht B. ich weiß, dass ich könnte, verwenden Sie einfach einen Tab Bar Controller, aber ich will nicht. Ich will sehen, wie Sie dies von hand gemacht, für das lernen, was Los ist unter der Haube.
Habe ich ein UIViewController, das wirkt wie ein root-controller:
@interface MyRootController : UIViewController {
IBOutlet UIView *contentView;
}
@property(nonatomic, retain) UIView *contentView;
@end
Den contentView angeschlossen wird, bis zu einer UIView, die ich Hinzugefügt als eine Untersicht auf "Ansicht" an der Spitze. Dieser ist grün und ich sehe es Vollbild. Funktioniert einwandfrei.
Dann habe ich zwei andere View-Controller so ziemlich die gleiche Weise. ViewControllerA und ViewControllerB. ViewControllerA hat einen blauen hintergrund, ViewControllerB hat einen schwarzen hintergrund. Nur um zu sehen das man aktiv ist.
So, in der Umsetzung von myRootController, Tue ich dies:
//Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
ViewControllerA *vcA = [[ViewControllerA alloc] initWithNib];
[self.contentView addSubview:vcA.view];
[cvA release];
}
Durch die Art und Weise, die -initWithNib Methode sieht wie folgt aus:
- (id)initWithNib { //Load the view nib
if (self = [super initWithNibName:@"ViewA" bundle:nil]) {
//do ivar initialization here, if needed
}
return self;
}
Funktioniert. Ich sehe den Blick von ViewControllerA, wenn ich starten Sie die app. Jetzt aber die große Frage ist: Eines View-Controller hat in der Regel alle diese Methoden wie:
- (void)viewWillAppear:(BOOL)animated;
- (void)viewDidDisappear:(BOOL)animated;
- (void)viewDidLoad;
...und so weiter. Wer oder was, oder wie würden Sie diese Methoden werden aufgerufen, wenn ich "meinen" Weg zu gehen, ohne einen tab bar controller? Ich meine: Wenn ich zuordnen, die ViewController-Klasse und der Aussicht bekommen, die sichtbar ist, würde ich aufpassen, über den Aufruf dieser Methoden? Woher weiß er, dass viewWillAppear, viewDidDisappear, oder viewDidLoad? Ich glaube, dass die Tab Bar Controller hat alle diese "cleverness" ist unter der Haube. Oder bin ich da falsch?
UPDATE: ich habe es getestet. Wenn ich Version des view-Controllers (zum Beispiel: ViewControllerA), bekomme ich keine log-Nachricht auf viewDidDisappear. Nur bei der Zuweisung und Initialisierung der ViewControllerA, bekomme ich eine viewDidLoad. Aber das ist es. Damit stehen alle Zeichen für die cleverness von UITabBarController jetzt 😉 und ich habe, um herauszufinden, wie zu replizieren, oder?
InformationsquelleAutor der Frage Thanks | 2009-05-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie beginnen, von der einfachsten removeFromSuperview/insertSubview und hinzufügen von code, um es wenig durch wenig.
InformationsquelleAutor der Antwort Chilly Zhong
Es ist ein schönes Beispiel, wechseln von Ansichten in Kapitel 6 der Anfang die iPhone-Entwicklung. Sehen Sie den source-code hier:
http://iphonedevbook.com/
SwitchViewController hat den code, um die Ansichten zu ändern programmgesteuert.
InformationsquelleAutor der Antwort nevan king
Wenn ich das richtig verstehe, was Sie versuchen zu erreichen, ist ziemlich einfach.
Fügen Sie einfach einen UINavigationController auf Ihre Anwendung zu delegieren und tun:
Delegierten werden entsprechend genannt:
Und wenn Sie wollen, um pop-Ansicht und schieben noch eins:
Wenn Sie nicht möchten, dass der navigationController zeigen, benutzen Sie einfach:
Wo navigationBar ist die UINavigationBar entsprechend Ihrem UINavigationController.
InformationsquelleAutor der Antwort Pablo Santa Cruz
Kann dies ein altes Thema, aber ich kam vor kurzem über das gleiche problem und hatte eine harte Zeit der Suche nach etwas, das funktioniert. Ich wollte wechseln zwischen zwei sich Ergänzende view-Controller, aber ich wollte den Schalter animiert werden (gebaut in den Animationen funktionieren gut), und ich wollte, dass es kompatibel mit storyboards, wenn möglich.
Anspruch zu nehmen, built-in transition, UIView ' s
+transitionFromView:toView:duration:options:completion:
Methode funktioniert wunderbar. Aber, es sind nur übergänge zwischen den Ansichten, nicht view-Controller.Für den übergang zwischen ganze view-Controller, nicht nur sichten, erstellen Sie eine benutzerdefinierte
UIStoryboardSegue
ist der Weg zu gehen. Ob oder nicht Sie verwenden storyboards, dieser Ansatz ermöglicht Ihnen die Kapseln die ganze Umstellung und verwalten und die Weitergabe von relevanten Informationen aus einem view controller auf die nächste. Es betrifft nur die UnterklassenUIStoryboardSegue
und überschreiben einer einzigen Methode-perform
.Für eine Referenz-Implementierung, siehe
RAFlipReplaceSegue
die genauen custom segue ich zusammen mit diesem Ansatz. Als bonus, es ersetzt auch die alte Ansicht-controller mit dem neuen, wenn es in einerUINavigationController
stack.InformationsquelleAutor der Antwort Ryan Artecona