【问题标题】:How to get the parentViewController in childViewController?如何在 childViewController 中获取 parentViewController?
【发布时间】:2016-03-31 03:46:06
【问题描述】:

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

我把这个放在AddInformationController:

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

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

// 问题更新:

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

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

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

【问题讨论】:

  • 显然,这完全取决于您何时进行日志记录,以及self。也许这里的self 与您小时候添加的实例不同。
  • 我已经把NSLog(@"%@", self.parentViewController)放到InformationSegmentController类的viewDidLoad方法中
  • 现在我明白了。 childViewController 的 viewDidLoad 调用早于 parentViewController。所以我可能在 parentViewController 之前 NSLog 它甚至添加 childViewController。

标签: ios objective-c childviewcontroller parentviewcontroller


【解决方案1】:

你必须这样尝试

//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];

【讨论】:

  • 如果你把@property (strong, nonatomic) AddInformationController * ParentVC放在接口里面的InformationSegmentController.h中,编译的时候会报错Unknown Type name AddInformationController。我 101% 确定我已导入该标题。
  • 我发现这更多是关于循环问题。由于 childViewController 必须在 parentViewController 之前加载,如果你尝试在 childViewController 中导入 parentViewController,childViewController 不知道什么是 parentViewController,因为它还不存在。所以我只使用@class 而不是#import,问题就解决了。
  • 据我了解,这是 viewController 的 Cycle 问题,但您也已正确导入。可能对您有帮助 stackoverflow.com/questions/7897268/xcode-unknown-type-name 尝试替换 (weak, nonatomic) 。我也会为你找到另一种方式。
  • 不不不,周期问题已经解决了 :) 感谢您的帮助
【解决方案2】:

为容器视图的两个 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;
        }
    }

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多