2013-12-24 14 views
8

Ich füge einen übergeordneten Ansichtscontroller zu einem übergeordneten Ansichtscontroller hinzu, und alles funktioniert wie erwartet, außer dass die üblichen Rückrufe des untergeordneten Ansichtscontrollers nicht ausgelöst werden. zB Dinge wie viewWillAppear (animiert) werden nie aufgerufen. Ich schaute hinein und dachte, es könnte sein, weil ich nicht WillMoveToParentViewController und DidMoveToParentViewController auf der Kind-View-Controller vor bzw. nach dem Hinzufügen zu dem Eltern aufrufen. Leider hat das Reparieren keinen Unterschied gemacht. Weiß jemand, wie ich dies verdrahten kann, so dass, wenn ich addChildViewController und removeChildViewController die regelmäßigen Rückrufe ausgelöst werden? Nachdem ich den childViewController hinzugefügt habe, füge ich seine Ansicht auch als Unteransicht zur Ansicht des übergeordneten View-Controllers hinzu. An keinem Punkt (addChildViewController & addSubview) Hat das Kind View-Controller des viewWillAppear (animiert), etc Methoden aufgerufen ...iOS Routing ViewDidAppear zu untergeordneten View-Controllern?

Nick

+0

Könnten Sie etwas Code darüber, wie Sie addChildViewController hinzufügen? – johnMa

+0

Diese Rückrufe sollten funktionieren. Sie müssen zeigen, wie Sie das Kind hinzufügen. – rdelmar

Antwort

4

Gerade versucht haben scheint folgend in viewDidLoad in dem übergeordneten Viewcontroller und es an der Arbeit

ChildExperimentViewController *child = [[ChildExperimentViewController alloc]init]; 
[self addChildViewController:child]; 
[self.view addSubview:child.view]; 
[child didMoveToParentViewController:self]; 
-4

Sie können manueller Aufruf des Kind Ansicht Controllers viewWillAppear in parectViewController, Code wie diese

-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [selectedViewController viewWillAppear:animated]; 
} 

wenn Sie fügen eine Navigation als childViewController Sie Code wie folgt in Navigation Delegierter

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    [viewController viewWillAppear:animated]; 
} 

, wenn Sie hinzufügen, eine TabBarController als childViewController hinzufügen können Sie Code wie folgt in TabBarController Delegierter und super Blick

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self.tabBarController.selectedViewController viewWillAppear:animated]; 
} 

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { 
    [viewController viewWillAppear:NO]; 
} 
hinzufügen

Ich weiß nicht, ob dies Ihr Problem lösen kann, hoffe, Ihnen helfen zu können.

+1

Wir sollten ViewWillAppear oder andere Methoden niemals manuell aufrufen. Bitte lesen Sie https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instm/UIViewController/beginAppearanceTransition:animated : – vivek

10

viewWillAppear, ViewDidAppear automatisch aufgerufen, wenn Sie Ihre ViewControler Ansicht auf eine Ansicht Hierarchie

viewWillDisappear Hinzufügen viewDidDisappear automatisch aufgerufen, wenn Sie Ihre ViewControler Ansicht aus einer Ansicht Hierarchie zu entfernen

Vielleicht werden diese Methoden nicht aufgerufen, weil Sie die Sub-Controller-Ansicht vor dem Anzeigen des Hauptansicht-Controllers hinzufügen und daher Ihre Hauptansicht nicht in Sicht ist selbst?

Wenn Ihr Hauptansicht-Controller erscheint oder verschwindet, sollten Sie diese Methoden für Childs in entsprechenden Methoden aufrufen.

6

Nicht sicher, ob dies auf Ihre Situation zutreffen kann, aber versuchen Sie, die Appearance Callback-Methoden manuell an Ihre Kinder zu senden.

Aus Sicht Controller Eindämmung Apfel documentation:

Aber manchmal kann das Standardverhalten die Ereignisse in einer Reihenfolge senden, die keinen Sinn für Ihren Container machen.Zum Beispiel, wenn mehrere Kinder gleichzeitig ihren Ansichtszustand ändern, möchten Sie möglicherweise die Änderungen konsolidieren, so dass die Aussehen Rückrufe alle gleichzeitig in einer logischeren Reihenfolge geschehen. Um dies zu tun, Sie ändern Sie Ihre Container-Klasse, um die Verantwortung für Aussehen oder Rotation Callbacks übernehmen.

Sie empfiehlt die Weiterleitung manuell Aussehen Rückrufe, um Ihre Kinder, wenn Sie mehr feinkörnige Kontrolle wollen:

// From the container view controller 
- (BOOL) shouldAutomaticallyForwardAppearanceMethods 
{ 
    return NO; 
} 

-(void) viewWillAppear:(BOOL)animated 
{ 
    [self.child beginAppearanceTransition: YES animated: animated]; 
} 

-(void) viewDidAppear:(BOOL)animated 
{ 
    [self.child endAppearanceTransition]; 
} 

-(void) viewWillDisappear:(BOOL)animated 
{ 
    [self.child beginAppearanceTransition: NO animated: animated]; 
} 

-(void) viewDidDisappear:(BOOL)animated 
{ 
    [self.child endAppearanceTransition]; 
} 
6

Versuchen Sie dieses:

childController.willMoveToParentViewController(self) 
childController.beginAppearanceTransition(true, animated: true) 

nach zu Ihrer View-Controller hinzugefügt

0
let vc = ChildVC.init() 
vc.frame = self.view.bounds 
self.addChildViewController(vc) 
self.view.addSubview(vc.view) 
vc.willMove(toParentViewController: self) 
vc.didMove(toParentViewController: self) 
0

Chourobinanswer in Swift:

override var shouldAutomaticallyForwardAppearanceMethods: Bool { 
    return false 
} 

override func viewWillAppear(_ animated: Bool) { 
    self.childViewControllers[self.segmentView.selectedSegmentIndex].beginAppearanceTransition(true, animated: animated) 
} 

override func viewDidAppear(_ animated: Bool) { 
    self.childViewControllers[self.segmentView.selectedSegmentIndex].endAppearanceTransition() 
} 

override func viewWillDisappear(_ animated: Bool) { 
    self.childViewControllers[self.segmentView.selectedSegmentIndex].beginAppearanceTransition(false, animated: animated) 
} 

override func viewDidDisappear(_ animated: Bool) { 
    self.childViewControllers[self.segmentView.selectedSegmentIndex].endAppearanceTransition() 
} 

P. S. Da ich den Verweis auf ein Kind VC nicht als eine Eigenschaft oder eine Variable halte. Ich ziehe es vor, mit dem aktuell ausgewählten Segmentindex darauf zuzugreifen. SegmentView ist eine dritte Partei UISegmentControl.