我学到了一个非常痛苦的教训,关于如何确保视图控制器的viewDidLoad上的出口是零,这是通过编写自己的initWith ...方法。
-(id)initWithDoohickey:(SomeDoohickey*)doohickey
{
self = [super init];
if (self)
{
theDoohickey = doohickey;
}
return nil;
}
现在当你调用这个方法而不是initWithNibName,或者只是init时,你的视图出口将是零,你将遇到各种调试噩梦。
所以我在这里看到两个解决方案......
(1)调用init或initWithNibName并让它做它的事情,然后使用classInQuestion configureWithDoohickey:(SomeDoohickey*)doohickey
或(2) 弄清楚如何正确编写一个真正正确加载nib的initWith ...方法,同时还允许我在同一个调用中传入我想要的任何配置变量。
我想知道如何做(2)。
答案 0 :(得分:2)
只需拨打[super init];
,即可将来电取代[super initWithNibName:...];
。
显然你需要传递正确的论据。
答案 1 :(得分:0)
你遇到的问题是你没有正确chain the initializers。子类的初始化过程必须(最终)调用其超类的designated initializer。指定的初始值设定项可确保正确设置所有类的数据。
如果你没有调用超类的DI,它就无法设置超类中定义的属性。
您使用的简单init
不是UIViewController
指定的初始值; initWithNibName:bundle:
是。正如rmaddy所说, 是您应该在子类中指定的初始化程序中使用的方法。
子类中的初始化器可以互相使用,只要其中一个最终传递给超类的DI。
(顺便说一句,这种关系已经在Swift中形式化了。初始化链接实际上是语言的一部分,而不仅仅是一种约定。这个can be confusing,但有趣的是,你编写initWithDoohickey:
的方式甚至不会在Swift中编译。)