如何从子视图控制器访问父视图控制器的视图?
Posted
技术标签:
【中文标题】如何从子视图控制器访问父视图控制器的视图?【英文标题】:how can i access a parent view controller's view from a child view controller? 【发布时间】:2012-01-19 19:47:13 【问题描述】:我有一个主视图控制器负责绘制我的 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];
【问题讨论】:
【参考方案1】:要访问父视图控制器,您可以使用self.parentViewController
。拥有它后,您只需使用其view
属性即可访问其视图
【讨论】:
在 Swift 3.0 中使用self.parent
"是的!Swift 3.0, %$^%!" (c) 绝命毒师
@aqs : 为什么 self.parent nil 在 ViewDidLoad 中?
@Kashif,请检查下一个答案。【参考方案2】:
使用 ios 5.x+ 的用户注意
self parentViewController
现在返回 nil
。您现在必须使用self presentingViewController
才能获得相同的结果。有关升级代码库的更多信息和其他解决方法,请参阅此博客文章:http://omegadelta.net/2011/11/04/oh-my-god-they-killed-parentviewcontroller/
【讨论】:
链接对我来说没有损坏。【参考方案3】:现在他们杀死了
self.parent
你可以使用
override func didMove(toParentViewController parent: UIViewController?)
【讨论】:
不确定是因为我正在以编程方式创建子视图还是self.parent
或self.presentingViewController
不再起作用,但didMove
方法是唯一适合我的解决方案。 (而且我在添加子视图时调用childViewController.didMove(toParentViewController: self)
)【参考方案4】:
这对我有用:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
NSString * segueName = segue.identifier;
if ([segueName isEqualToString: @"child-view"])
ChildViewController * childViewController = (ChildViewController *) [segue destinationViewController];
[self addChildViewController:childViewController];
【讨论】:
【参考方案5】:我使用客观 c 块方法来实现这一点。看看这个积木教程。 https://www.youtube.com/watch?v=FS4JAy1Wy3w
【讨论】:
以上是关于如何从子视图控制器访问父视图控制器的视图?的主要内容,如果未能解决你的问题,请参考以下文章
在 Cocoa,UIResponder 中将消息从子视图发送到父视图?