繁体   English   中英

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

[英]Accessing and manipulating parent view controllers views from a container view IOS

我正在制作一个具有容器视图的应用程序,该视图是视图控制器屏幕的一半。 在容器视图控制器的类中,我试图访问和操纵位于容器视图之外的视图。 (下图)

在此处输入图片说明

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

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时,一切都按预期工作。 我需要能够从容器中操作视图。 有人可以帮忙吗?

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

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

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

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

在Storyboard和iOS> = 6的情况下,您可以使用嵌入式Segue设置子视图控制器,然后在prepareForSegue方法中将父视图控制器设置为子视图控制器的委托。 这是让孩子与父母交流的一种干净方法。 (我在github上有一个示例应用程序,如果您需要更详细的说明,它将演示此技术。)

至于编程道德,正确性,良好做法等,我想其他人都可以涵盖。 您肯定想做的事情不是干净的方法,但是我经常发现自己会寻求这种捷径,但是您确实需要知道自己在做什么,如果以后再也不会咬人。 好消息是,只需一行代码即可实现,并且开销非常低。 问题在于这种方法高度依赖于视图结构,因此,如果更改它,它将不再起作用。

话虽这么说。 您尝试的方法不起作用,因为未在任何任意视图上设置' parentViewController '属性。 它只能在视图控制器的主视图上定义,您可以从“ viewController.view ”访问该视图。

我将从您的评论中假设您的视图结构如下所示:

UIView
    UIView
        UIScrollView
    Container

因此,基本上从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];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM