如何获取childViewController中的parentViewController?

How to get the parentViewController in childViewController?

我有一个主 UIViewController 并命名为 AddInformationController。在这个 mainViewController 我有两个 UIContainerView。他们每个人都嵌入了一个UITableViewController。 table 视图控制器被命名为 InformationSegmentControllerResultSegmentController

我把这个放在 AddInformationController:

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

InformationSegmentController class 或 ResultSegmentController class 中,我尝试记录以下内容: NSLog(@"%@",self.parentViewController); 但不幸的是,它是零。如何正确获取 parentViewController?我必须使用 prepareForSegue 吗?

// 问题更新:

我发现如果我直接在故事板中创建那些 childViewControllers,我不必再次调用 addChildViewController 方法。

我在 AddInformationController 中尝试 NSLog(@"%@", self.childViewControllers) 结果包含 InformationSegmentController class 和 ResultSegmentController class.

但问题是当我在 viewDidLoad 中的两个 childViewContorllers 上调用 NSLog(@"%@", self.parentViewController) 时,结果为零。

你必须这样尝试

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

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

希望对您有所帮助。


ChildViewControler 中获得 PerentViewController 的另一种方法是在你的 ChildViewController.h 中创建 @property (strong, nonatomic) AddInformationController *ParentVC; 并从你的 ParentViewController 中分配 viewController Like

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

为您的容器视图的两个 segue 提供标识符(假设 "InformationSegmentControllerSegue" 和 "ResultSegmentControllerSegue",即)并在您的 AddInformationController 中使用 prepareForSegue,如下所示:

    - (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;
        }
    }

希望对您有所帮助。