从故事板添加自定义初始化子视图

时间:2013-05-17 11:56:10

标签: iphone ios objective-c uiviewcontroller uistoryboard

我有一个UIViewController的子类,我想从故事板中添加。

所以我正在使用看似标准的方法:

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

哪个好,但是如果我想在子视图上调用自定义init方法呢?

我可以做类似的事情:

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

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

这是最好的方法吗?

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

也许我应该把它叫做setWithFoo:或者其他东西而不是让它返回任何东西?

3 个答案:

答案 0 :(得分:0)

如果要在从故事板中实例化后对视图控制器进行其他设置,可以在视图控制器的类中创建一些方法,并在故事板的instantiate方法之后调用它们。

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

答案 1 :(得分:0)

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

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

覆盖该方法(不要忘记致电super

答案 2 :(得分:0)

基本上我认为答案是你不能在故事板上添加的ViewControllers上使用自定义初始化器。相反,您必须在生命周期的适当时间直接或通过方法设置属性,如上所述。

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

如果在添加子视图之前调用它,我在尝试使用包含对super的调用的自定义初始化程序时遇到了问题。我想添加一个空白视图,我认为因为超类似乎不知道那时的故事板。我取消了对超级电话的更多成功,但这似乎不对。

将子视图添加到滚动视图时,此案例更为相关。为简单起见,我把它留在了我的例子中。