0

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

在此处输入图像描述

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

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

4

2 回答 2

3

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

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

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

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

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

于 2014-02-05T01:03:21.727 回答
0

至于编程道德、正确性、良好实践等等,我认为其他人已经涵盖了这些。你想做的肯定不是干净的方法,但我经常发现自己在走这样的捷径,但你真的需要知道你在做什么,如果它以后不会回来咬你。好处是只需要一行代码即可实现,而且开销非常低。问题是这种方法高度依赖于视图结构,所以如果你改变它,它将不再起作用。

话虽如此。您尝试的方法不起作用,因为未在任何任意视图上设置“ 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];
于 2014-02-05T01:03:12.997 回答