我有一个UIViewController创建另一个视图控制器,并将其视图添加为子视图:
在父UIViewController中:
SlateMoreView* subView = [[SlateMoreView alloc] initWithNibName:@"SlateMoreView" bundle:nil];
[self.view addSubview:subView.view];
然后我需要在父视图中调用子视图中的方法。
我在使用[self.navigationController pushViewController:subView animated:YES]添加子UIViewController时看到了如何执行此操作,因为我可以使用这种代码找到父代:
在子视图UIViewController中:
NSArray* viewControllerArray = [self.navigationController viewControllers]
int parentViewControllerIndex = [viewControllerArray count] - 2;
SlateView* slateView = [viewControllerArray objectAtIndex:parentViewControllerIndex];
...然后我可以向它发送消息。但是由于我使用addSubView手动添加了子视图,我无法做到这一点。
有人能想到我如何与我的父UIViewController交谈吗?
谢谢!
答案 0 :(得分:1)
UIView
有一个superview
属性,似乎正是您要找的。 p>
此外,您可能不希望嵌套UIViewController
的视图,除非您非常谨慎地构建自定义包含视图控制器。见http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers/
答案 1 :(得分:0)
您可能想要考虑使用NSNotifications是否可以解决您的问题。当感兴趣的听众(您的超级视图)需要了解事件时,您可以发布子视图的通知。当superview收到通知时,它可以运行您想要的任何代码。子视图一直都不需要知道超级视图。
这是让你的课程相互依赖的一种方法。
你也可以使用委托作为另一种选择。
答案 2 :(得分:0)
将视图作为子视图添加到视图层次结构时,将其放在响应程序链中。您可以通过UIView
控制UIViewController
UIViewController
作为其nextResponder
,向响应者链上移动以访问视图控制器。
id object = theSubview;
do {
object = [object nextResponder];
} while ( ![object isMemberOfClass:[YourViewController class]] );
// object has the view controller you need.