如何在viewController上编写initWith ...

时间:2016-04-20 21:22:44

标签: ios objective-c

我学到了一个非常痛苦的教训,关于如何确保视图控制器的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)。

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中编译。)