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

Ios 从容器视图访问和操作父视图控制器视图,ios,objective-c,viewcontroller,parentviewcontroller,uicontainerview,Ios,Objective C,Viewcontroller,Parentviewcontroller,Uicontainerview,我正在制作一个应用程序,其中我有一个容器视图,它是我的视图控制器屏幕的一半。从容器视图控制器的类中,我试图访问和操作位于容器视图外部的视图。(下图) 我正在尝试从container view类访问项目并将其添加到滚动视图,如下所示: parent = (GFProfileViewController*)[self parentViewController]; UIScrollView *scroll = (UIScrollView *)[parent.view viewWithTag:222

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

我正在尝试从container view类访问项目并将其添加到滚动视图,如下所示:

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时,所有的工作都如预期的那样。不过,我需要能够从容器操纵视图。有人能帮忙吗?

至于编程道德、正确性、良好实践等等,我想其他人已经涵盖了这些。你想做的当然不是干净的方式,但我经常发现自己走这样的捷径,但你真的需要知道你在做什么,以及它是否会回来咬你。好的方面是它只需要一行代码就可以实现,并且开销非常低。问题是,这种方法高度依赖于视图结构,因此,如果更改它,它将不再有效

这么说吧。您尝试的操作无效,因为未在任何任意视图上设置“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];

至于编程道德、正确性、良好实践等等,我认为其他人已经涵盖了这一点。你想做的当然不是干净的方式,但我经常发现自己走这样的捷径,但你真的需要知道你在做什么,以及它是否会回来咬你。好的方面是它只需要一行代码就可以实现,并且开销非常低。问题是,这种方法高度依赖于视图结构,因此,如果更改它,它将不再有效

这么说吧。您尝试的操作无效,因为未在任何任意视图上设置“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];

至于编程道德、正确性、良好实践等等,我认为其他人已经涵盖了这一点。你想做的当然不是干净的方式,但我经常发现自己走这样的捷径,但你真的需要知道你在做什么,以及它是否会回来咬你。好的方面是它只需要一行代码就可以实现,并且开销非常低。问题是,这种方法高度依赖于视图结构,因此,如果更改它,它将不再有效

这么说吧。您尝试的操作无效,因为未在任何任意视图上设置“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];

至于编程道德、正确性、良好实践等等,我认为其他人已经涵盖了这一点。你想做的当然不是干净的方式,但我经常发现自己走这样的捷径,但你真的需要知道你在做什么,以及它是否会回来咬你。好的方面是它只需要一行代码就可以实现,并且开销非常低。问题是,这种方法高度依赖于视图结构,因此,如果更改它,它将不再有效

这么说吧。您尝试的操作无效,因为未在任何任意视图上设置“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];

正如nhgrif所说,不要那样做

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

同样,正如nhgrif所说,在