我有一个UIViewController
的子类,我想从故事板中添加。
所以我正在使用看似标准的方法:
SubViewController *svc = [self.storyboard instantiateViewControllerWithIdentifier:@"SubViewControllerID"];
[self addChildViewController:svc];
[self.view addSubview:svc.view];
哪个好,但是如果我想在子视图上调用自定义init方法呢?
我可以做类似的事情:
svc = [svc initWithFoo:@"Hello"];
似乎必须在addSubview调用之后才能使其工作。
这是最好的方法吗?
似乎有点不正统。在已经创建的对象上调用init方法似乎不再是真正的init方法。
也许我应该把它叫做setWithFoo:或者其他东西而不是让它返回任何东西?
答案 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的调用的自定义初始化程序时遇到了问题。我想添加一个空白视图,我认为因为超类似乎不知道那时的故事板。我取消了对超级电话的更多成功,但这似乎不对。
将子视图添加到滚动视图时,此案例更为相关。为简单起见,我把它留在了我的例子中。