0
MyViewController *myVC = (MyViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];

[scrollView addSubview:myVC.view];

上面的代码有效,它加载了我在我的情节提要中的一个视图控制器,情节提要 ID 为:“MyViewController”,并将其显示为子视图。

唯一的事情是,例如,我想在执行 addSubview 之前在该视图控制器上设置 UILabel 的文本。

像这样:

MyViewController *myVC = (MyViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];

myVC.aTextLabel.text = @"pippo";

[scrollView addSubview:myVC.view];

但是,这不起作用。UILabel 为空。- 在我做 addSubview 之后,我不能对视图做任何事情。像这样:

MyViewController *myVC = (MyViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];

[scrollView addSubview:myVC.view];

myVC.aTextLabel.text = @"pippo";

上面的工作,但它并不漂亮,标签的文本在添加视图后发生了变化!

当我以前在没有故事板的情况下这样做时,我会这样做:

MyViewController *myVC = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];

    myVC.aTextLabel.text = @"pippo";

    [scrollView addSubview:myVC.view];

这会很好。

我正在显示的视图没有通过序列连接到其他视图,我将它的多个实例并排加载到 UIScrollView 中,所以我希望最简单的方法类似于上面的方法。

那么,如何以编程方式实例化视图,更新该视图上的 UILabel,然后将其添加为子视图?

4

1 回答 1

2

所以问题是,虽然视图控制器被创建(分配和初始化),但它的视图层次结构直到有人引用它的视图属性才被加载。

因此,当您阅读myVc.view(实际上是[myVc view])时,如果尚未加载视图控制器,则会导致视图控制器从情节提要中加载其视图。

您可能需要在这里考虑您的设计。创建一个视图控制器,只是为了获取它的视图并将它们添加到其他视图层次结构中并不是一个好主意,除非你在容器视图控制器 API 的框架内这样做。

如果您想一次在屏幕上将多个视图控制器组合在一起,请查看视图控制器编程指南中的“创建自定义容器视图控制器” 。

于 2013-03-04T23:06:41.480 回答