0

我有一个UIViewController要从情节提要中添加的子类。

所以我使用的是标准方法:

SubViewController *svc = [self.storyboard instantiateViewControllerWithIdentifier:@"SubViewControllerID"];
[self addChildViewController:svc];
[self.view addSubview:svc.view];

这很好,但如果我想在子视图上调用自定义初始化方法怎么办?

我可以做类似的事情:

svc = [svc initWithFoo:@"Hello"];

这似乎必须在 addSubview 调用之后才能工作。

这是最好的方法吗?

好像有点不正统。在已经创建的对象上调用 init 方法似乎不再是真正的 init 方法。

也许我应该称它为 setWithFoo: 或其他什么,而不是让它返回任何东西?

4

3 回答 3

0

如果您想在从情节提要中实例化视图控制器后对其进行额外设置,您可以在视图控制器的类中创建一些方法并在instantiate情节提要的方法之后调用它们。

但请注意,如果您尝试在这些方法中对任何 UI 组件进行更改,它们将不会被应用,并且应用程序可能会崩溃。因此,使用这些方法将参数设置为视图控制器,如对象数组或任何类型的数据,并在视图控制器的viewDidLoad/viewWillAppear/viewDidAppear方法中应用视图控制器视图的 UI 更改。

于 2013-05-17T12:01:26.520 回答
0

SubViewController *svc = [self.storyboard instantiateViewControllerWithIdentifier:@"SubViewControllerID"];

将导致 SubViewController 使用它的- (id)initWithCoder:(NSCoder *)decoder {}方法进行初始化。

覆盖该方法(不要忘记调用super

于 2013-05-17T13:28:20.423 回答
0

本质上,我认为答案是您不能在从情节提要添加的 ViewControllers 上使用自定义初始化程序。相反,您必须在生命周期中的适当时间直接或通过方法设置属性,如上所述。

同样如前所述,VC 将通过 实例化initWithCoder,因此调用额外的初始化程序可能是多余的(?)。

如果我在添加子视图之前调用了包含对 super 的调用的自定义初始化程序,我在尝试使用它时遇到了问题。我想我只会添加一个空白视图,因为当时超类似乎不知道情节提要。我在取消对 super 的调用方面取得了更大的成功,但这似乎是错误的。

在将子视图添加到滚动视图时,这种情况会更加相关。为简单起见,我将其排除在示例之外。

于 2013-05-19T13:38:17.367 回答