如何从子视图控制器中访问父视图控制器的视图?

19

我有一个主视图控制器,负责处理我的2D OpenGL ES视图的绘制,还有一个子视图控制器buttonManager,确定在启动期间要加载和绘制哪些按钮。

一旦用户按下其中一个按钮,就会创建此视图控制器并且其视图应该出现,但是视图从未被添加,但已经测试过可以工作。这是来自主视图控制器的代码:

 buttonManager=[[ButtonManager alloc] init];
 [self addChildViewController:buttonManager];
 [self.view addSubview:buttonManager.view];

这是启动这个视图的代码:

-(void)launchStopDialog: (NSString*)stopName {
    NSLog(@"stopdialog should be launched.");
    if (stopDialogController == nil)
        stopDialogController = [[StopDialogController alloc] initWithNibName:@"StopDialog" bundle:nil];
    if (stopDialogController)
        [stopDialogController presentWithSuperview:self.view.superview withStopName:stopName]; 
}
5个回答

45
为了访问父视图控制器,您可以使用 self.parentViewController。一旦您拥有了它,您可以通过使用其 view 属性来简单地访问其视图。

14
在Swift 3.0中,请使用self.parent。 "Yeah! Swift 3.0, %$^%!" (引自《绝命毒师》) - Aleksey Potapov
2
@aqs:为什么ViewDidLoad中的self.parent是nil - Kashif
@Kashif,请查看下一个答案。 - Hola Soy Edu Feliz Navidad

29

1
链接对我来说没有断开。 - Hola Soy Edu Feliz Navidad

4
现在,他们杀死了这个。
self.parent

您可以使用

标签。

override func didMove(toParentViewController parent: UIViewController?)
{        
}

我不确定是因为我在程序中创建了子视图,还是self.parent或者self.presentingViewController不再起作用,但是didMove方法是唯一对我有效的解决方案。(并且当我添加子视图时,我调用了childViewController.didMove(toParentViewController: self)) - Jose

3
这是我的解决方案:

以下是我所采用的方法:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    NSString * segueName = segue.identifier;
    if ([segueName isEqualToString: @"child-view"]) {
        ChildViewController * childViewController = (ChildViewController *) [segue destinationViewController];
        [self addChildViewController:childViewController];
    }
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接