从容器视图IOS访问和操作父视图控制器视图

时间:2014-02-05 00:32:41

标签: ios objective-c viewcontroller parentviewcontroller uicontainerview

我正在创建一个应用程序,其中我的容器视图是我的视图控制器的一半。从容器视图控制器的类中,我试图访问和操作位于容器视图一侧的视图。 (下图)

enter image description here

我正在尝试从容器视图类访问和添加项目到滚动视图,如下所示:

parent = (GFProfileViewController*)[self parentViewController];
UIScrollView  *scroll = (UIScrollView *)[parent.view viewWithTag:222];
parent.titleHolders.contentSize = CGSizeMake(320 * 4,60);
UILabel *testLabel = [[UILabel alloc] init];
[testLabel setFrame:CGRectMake(0, 0, 100, 40)];
[testLabel setText:@"My Test label"];
[parent.titleHolders addSubview:testLabel];
scroll.backgroundColor = [UIColor blueColor];

怎么都行不通。我甚至尝试从父母那里访问视图"查看标签"方法。

既不起作用。

我知道代码很好,因为当我将它移动到父vc时,所有代码都按预期工作。我需要能够从容器操纵视图。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

正如nhgrif所说,不要这样做。

您应该将另一个视图控制器的视图视为私有。

再次,正如nhgrif所说,在父视图控制器中创建一个公共方法,该方法获取所需的信息并进行显示。

如果刚刚初始化视图控制器,则父视图控制器的视图层次结构可能尚不存在。在这种情况下,您需要设置属性以保存要显示的值,然后在viewWillAppear方法中显示它们。

使用storyboards和iOS> = 6,您可以使用embed segue设置子视图控制器,然后在prepareForSegue方法中,您可以将父视图控制器设置为子视图控制器的委托。这是让孩子与父母交流的干净方式。 (如果您需要更详细的解释,我有sample app on github演示此技术。)

答案 1 :(得分:0)

就编程道德,正确性,良好实践等等而言,我认为其他人已经涵盖了这一点。你想要做的事情肯定不是干净利落的方式,但我经常发现自己会选择这样的捷径,但你真的需要知道自己在做什么,以及它是否会在以后回来咬你。好处是它需要一行代码才能实现并且开销很低。问题是这种方法高度依赖于视图结构,所以如果你改变它,它将不再有效。

有了这样说。您尝试的操作不起作用,因为未在任意视图上设置“ parentViewController ”属性。它只应在视图控制器的主视图上定义,您可以从“ viewController.view ”访问该视图。

我将从您的评论中假设您的视图结构类似于:

UIView
    UIView
        UIScrollView
    Container

所以基本上从容器开始,你需要上升一个级别,然后再下到 UIScrollView ,如下所示:

UIScrollView = [((UIView*)[self.superview.subviews objectAtIndex:0]).subviews objectAtIndex:0];

我不确定你是否可以从上方视图搜索标签,因为你正在搜索的那个是嵌套在里面的地方,比一个级别更低。假设你实际上可以做到这一点,这也应该有效并且更加失败。

UIView *upperView = self;
while([upperView superview]){
    upperView = [upperView superview];
}
UIScrollView *scroll = [upperView viewWithTag:222];