我正在创建一个应用程序,其中我的容器视图是我的视图控制器的一半。从容器视图控制器的类中,我试图访问和操作位于容器视图一侧的视图。 (下图)
我正在尝试从容器视图类访问和添加项目到滚动视图,如下所示:
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时,所有代码都按预期工作。我需要能够从容器操纵视图。有人可以帮忙吗?
答案 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];