1

Ich habe eine Haupt UIViewController und benannte AddInformationController. In diesem mainViewController habe ich zwei UIContainerView. Jeder von ihnen eingebettet mit einem UITableViewController. Die Tabellenansicht-Controller heißen InformationSegmentController und ResultSegmentController.Wie bekomme ich den parentViewController in childViewController?

Ich habe dies in AddInformationController:

InformationSegmentController *isc = [self.storyboard instantiateViewControllerWithIdentfier:@"InformationSegmentController"]; 
ResultSegmentController *rsc = [self.storyboard instantiateViewControllerWithIdentifier: @"ResultSegmentController"]; 
[self addChildViewController: isc]; 
[self addChildViewController: rsc]; 

In jedem der InformationSegmentController Klasse oder ResultSegmentController Klasse, habe ich versucht, dies Protokoll: NSLog(@"%@",self.parentViewController); Aber leider ist es eine Null. Wie kann ich den ParentViewController richtig erhalten? Muss ich die prepareForSegue verwenden?

// Frage Update:

fand ich, dass ich wieder addChildViewController Methode nicht aufrufen, wenn ich diese childViewControllers direkt in mein Drehbuch erstellen.

Ich habe versucht, NSLog(@"%@", self.childViewControllers) in meinem AddInformationController und das Ergebnis enthält InformationSegmentController Klasse und ResultSegmentController Klasse.

Aber das Problem ist, wenn ich NSLog(@"%@", self.parentViewController) auf beiden childViewContorlers in viewDidLoad aufrufen, ist das Ergebnis Null.

+0

Offensichtlich hängt alles davon ab, _when_ Sie das Protokollieren und _who_ ist "selbst". Vielleicht ist das "Selbst" hier nicht dasselbe, das Sie als Kind hinzugefügt haben. – matt

+0

Ich habe die 'NSLog (@"% @ ", self.parentViewController)' in der 'viewDidLoad' Methode in der InformationSegmentController Klasse –

+0

Jetzt verstehe ich. Der ViewDidLoad des childViewControllers ruft früher als der parentViewController auf. Also NSLog ich es wahrscheinlich bevor der parentViewController sogar den childViewController hinzufügt. –

Antwort

1

Sie haben ähnliche

//add childview 
    [self addChildViewController:aVC]; 
    [self.view addSubview:aVC.view]; 
    [aVC didMoveToParentViewController:self]; 

    //remove 
    [self removeFromParentViewController]; 
    [self didMoveToParentViewController:nil]; 
    [self.view removeFromSuperview]; 

versuchen Hoffe, dass es Ihnen hilft.

OR
eine andere Art und Weise zu bekommen PerentViewController in ChildViewControler@property (strong, nonatomic) AddInformationController *ParentVC; in Ihr ChildViewController.h Stellen und zuweisen viewController von Ihrem ParentViewController Wie

InformationSegmentController *isc = [self.storyboard instantiateViewControllerWithIdentfier:@"InformationSegmentController"]; 
isc.ParentVC = self; 
[self addChildViewController: isc]; 
+1

Wenn Sie '@property (strong, nonatomic) AddInformationController * ParentVC' in die InformationSegmentController.h innerhalb der Schnittstelle einfügen, wird beim Kompilieren ein Fehler angezeigt, der besagt: 'Unbekannter Typname AddInformationController'. Ich bin mir 101% sicher, dass ich diesen Header importiere. –

+1

Und ich fand heraus, dass es viel mehr um das zirkuläre Thema geht. Da der childViewController vor dem parentViewController geladen werden muss, wenn Sie versuchen, den parentViewController in den childViewController zu importieren, weiß der childViewController nicht, was parentViewController ist, da er noch nicht existiert.Also benutze ich '@ class' anstelle von' # import' und das Problem wurde behoben. –

+0

nach meinem Verständnis ist dies Cycle-Problem von ViewController, aber Sie haben auch richtig importiert. vielleicht hilft es dir http://stackoverflow.com/questions/7897268/xcode-unknown-type-name ** ODER ** versuche zu ersetzen '(schwach, nichtatomisch)'. Auch ich werde einen anderen Weg für dich finden. – Vvk

0

Bezeichner Geben Sie sowohl den segues zu Ihrem Container Ansichten (annehmen „InformationSegmentControllerSegue "und" ResultSegmentControllerSegue ", nämlich) und verwende prepareForSegue in deinem AddInformationController wie folgt:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    { 
     if ([[segue identifier] isEqualToString:@"InformationSegmentControllerSegue"]) { 
      InformationSegmentController *container1 = segue.destinationViewController; 
     } 
else if([[segue identifier] isEqualToString:@"ResultSegmentControllerSegue"]) { 
      ResultSegmentController *container2 = segue.destinationViewController; 
     } 
    } 

Hoffe das hilft dir.

Verwandte Themen