我正在尝试修改在故事板中创建的视图。我可以读取并记录视图的属性(如框架 - 见下文),它们是预期的,所以我确信我有一个有效的视图引用。我想做各种修改,包括改变它的背景颜色和它的仿射变换,并添加一个标签,但我不能得到任何修改工作。
一些代码:
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
self.storyboardVC = [sb instantiateInitialViewController];
self.viewA = [self.storyboardVC.view viewWithTag:77];
NSLog(@"\nVC: %@\nviewA: %@", self.storyboardVC, self.viewA);
self.viewA.backgroundColor = [UIColor greenColor];
CGRect r = CGRectMake(100, 25, 50, 50);
UILabel *tag = [[UILabel alloc] initWithFrame:r];
tag.backgroundColor = [UIColor orangeColor];
tag.text = @"tag";
[self.viewA addSubview:tag];
尺寸使得标签标签应该适合viewA,但“标签”标签永远不会出现。背景颜色也不会改变。我使viewA alpha = 0.4所以我可以看到标签标签是否落后于它,但没有。所有视图都有userInteractionEnabled,并在故事板中检查了autoresize子视图。
我也尝试过其他程序化修改,但他们都没有做任何事情。就像视图是只读的一样。我在这里缺少什么?
答案 0 :(得分:0)
你缺少的是Cocoa是一个框架。您必须了解它正在做什么,并使用来,而不是反对它。
这里的问题是,这不是使用视图控制器及其视图的合法方式:
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
self.storyboardVC = [sb instantiateInitialViewController];
self.viewA = [self.storyboardVC.view viewWithTag:77];
您正在任意拉出(实例化)视图控制器(storyboardVC
)并使用其视图(viewA
),但该视图控制器不是应用程序视图控制器层次结构和视图的一部分不是它的视图层次结构的一部分 - 这些都不会发生在你的应用程序界面中。所以你自然也看不到任何东西。你可以在一个被丢弃的隐形副本上完成所有这些操作。 (你知道,你不能使用代码来改变故事板本身; storyboard 确实是只读的。)
要在视图中进行实际可以看到的更改,请等到框架告诉您视图即将出现在界面中(例如视图控制器的viewDidLoad
或viewWillAppear
)。这就是这些生命事件消息的用途。