在通过addSubview添加之后,在父UIViewController中调用方法

时间:2011-05-14 16:43:32

标签: iphone ios uiviewcontroller parent addsubview

我有一个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交谈吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

UIView有一个superview属性,似乎正是您要找的。

此外,您可能不希望嵌套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.