Wann addChildViewController
Ich versuche, etwas zu haben, ähnlich wie ein UINavigationController, so kann ich passen Sie die Animationen. Um zu beginnen, ich bin nur mit den Apple-Aktien-Animationen. Hier ist meine containerViewController:
- (void)loadView {
//Set up content view
CGRect frame = [[UIScreen mainScreen] bounds];
_containerView = [[UIView alloc] initWithFrame:frame];
_containerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.view = _containerView;
}
- (id)initWithInitialViewController:(UIViewController *)vc {
self = [super init];
if (self) {
_currentViewController = vc;
[self addChildViewController:_currentViewController];
[self.view addSubview:_currentViewController.view];
[self didMoveToParentViewController:self];
_subViewControllers = [[NSMutableArray alloc] initWithObjects:_currentViewController, nil];
}
return self;
}
- (void)pushChildViewController:(UIViewController *)vc animation:(UIViewAnimationOptions)animation {
vc.view.frame = _containerView.frame;
[self addChildViewController:vc];
[self transitionFromViewController:_currentViewController toViewController:vc duration:0.3 options:animation animations:^{
}completion:^(BOOL finished) {
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];
[self.subViewControllers addObject:vc];
}];
}
- (void)popChildViewController:(UIViewController *)vc WithAnimation:(UIViewAnimationOptions)animation {
//Check that there is a view controller to pop to
if ([self.subViewControllers count] <= 0) {
return;
}
NSInteger idx = [self.subViewControllers count] - 1;
UIViewController *toViewController = [_subViewControllers objectAtIndex:idx];
[vc willMoveToParentViewController:nil];
[self transitionFromViewController:vc toViewController:toViewController duration:0.3 options:animation animations:^{
}completion:^(BOOL finished) {
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
[self didMoveToParentViewController:toViewController];
[self.subViewControllers removeObjectAtIndex:idx];
}];
}
Habe ich diese ContainerViewcontroller als meine rootViewController des Fensters. Ich kann hinzufügen, meine Initialen viewController und schieben Sie einen view-controller. Wenn ich versuche zu pop, obwohl, ich bekomme
ContainerViewController[65240:c07] Unbalanced calls to begin/end appearance transitions for <SecondViewController: 0x8072130>.
Frage ich mich, was ich falsch mache. Ich dachte, meine initialViewController ist noch unterhalb der secondViewController. Irgendwelche Gedanken? Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß nicht, ob das ist, was die Ursache Ihres Problems, doch sollte dies nicht:
werden:
Auch, ich bin mir nicht sicher, was Sie tun, mit der subViewControllers array. Es scheint eine Vervielfältigung der childViewControllers array, das ist schon eine Eigenschaft eines UIViewController.
Eine andere Sache, ich bin mir nicht sicher, ist richtig. In Ihrem pop-Methode, die Ihr toViewController ist der Letzte Domänencontroller in der _subViewControllers array. Wollen Sie nicht, dass es die vorletzte? Sollte nicht der Letzte sein, den Sie knallen? Sie knallen vc, die ist ein controller, den Sie übergeben haben, in der Methode, die ich nicht verstehe, dass.
Dies ist der Weg, den ich gemacht habe, eine navigation wie controller. In seiner containment-Verhalten, es wirkt wie ein Navigations-controller, aber ohne Navigationsleiste und die Möglichkeit, verschiedene übergangsanimationen:
Nachdem Edit: ich war in der Lage, duplizieren Sie die zurück-Taste Funktion mit dieser Steuerung durch das hinzufügen einer Navigationsleiste, um alle meine Controller im IB (einschließlich die, die das custom-container-controller). Ich habe eine bar-Taste, um alle Controller, die geschoben werden, und Ihre Titel zu null (ich habe einige Probleme wenn ich Links den Titel als "item"). Löschen, der Titel lässt den button verschwinden (bei der IB), aber Sie können weiterhin verbindungen herstellen, um es in der Szene, in der Liste. Ich fügte hinzu, ein IBOutlet zu es und fügte diesen code, um die Funktion, die ich wollte:
Ich habe gezeigt, zwei verschiedene Möglichkeiten gearbeitet, um Zugriff auf einen Titel-in IB können Sie einen Titel für die controller, die ich benutzt habe in der else-Klausel, oder verwenden Sie die navigationItem Titel wie ich in der wenn-Teil des Satzes. Die "-3" in der else-Klausel ist notwendig, weil zu der Zeit viewWillAppear heißt, der controller, der wird geholt, ist immer noch in der childViewControllers array.
addChildViewController
sollte zuerst aufgerufen werdenFür das hinzufügen /entfernen, finden Sie in dieser großen Kategorie-und keine Sorge, wenn es zu nennen:
UIViewController + Container
Neben rdelmar die Antwort sollten Sie nicht anrufen, addView/removeFromSuperview
transitionFromViewController
tut dies für Sie, aus der Dokumentation: