指定初始化程序缺少对超类的指定初始化程序的超级调用

Posted

技术标签:

【中文标题】指定初始化程序缺少对超类的指定初始化程序的超级调用【英文标题】:Designated initializer missing a super call to designated initializer of the super class 【发布时间】:2016-05-25 10:37:09 【问题描述】:

我的代码在这里:

(instancetype)initWithFrame:(CGRect)frame

self = [[[NSBundle mainBundle] loadNibNamed:@"LSCouponADView" owner:Nil options:nil] objectAtIndex:0];
if (self) 



    return self;

然后xcode有警告

指定初始化程序缺少对指定初始化程序的超级调用 超类的

当我构建它时。

【问题讨论】:

这个类的父类是什么? 【参考方案1】:

你需要在这个方法中添加这一行。

self = [super initWithFrame:frame];
if(self) 


return self;

来自Apple Doc。

指定初始化器

采用完整的初始化参数的类的初始化器通常是指定的初始化器。子类的指定初始化程序必须通过向 super 发送消息来调用其超类的指定初始化程序。便利(或辅助)初始化程序——可以包括 init——不调用 super。取而代之的是,他们调用(通过给自己的消息)具有下一个参数的系列中的初始化程序,为未传递给它的参数提供默认值。本系列的最后一个初始化器是指定初始化器。

【讨论】:

【参考方案2】:

你应该让你的班级像这样:

运行时间初始化:>

-(instancetype)initWithFrame:(CGRect)frame 
self = [super initWithFrame:frame];
        if(!self)
            return nil;
        

        NSBundle *mainBundle = [NSBundle mainBundle];
        NSArray *views = [mainBundle loadNibNamed:@"LSCouponADView" 
                                            owner:nil 
                                          options:nil];
//above nib name should not be hard coded, it should be like this:
//NSArray *views = [mainBundle loadNibNamed:NSStringFromClass([self class]) 
                                                owner:nil 
                                              options:nil];
        [self addSubview:views[0]];

    return self;
    

您还应该覆盖 xib 初始化:

-(id)initWithCoder:(NSCoder *)aDecoder
    
        self = [super initWithCoder:aDecoder];
        if(!self)
            return nil;
        

        NSBundle *mainBundle = [NSBundle mainBundle];
        NSArray *views = [mainBundle loadNibNamed:@"LSCouponADView" 
                                                owner:nil 
                                              options:nil];
        [self addSubview:views[0]];

    return self;
    

总而言之,您可以创建一个从 nib 加载的通用方法。

【讨论】:

我是按照你的想法来做的 -(instancetype)initWithFrame:(CGRect)frame self = [super initWithFrame:frame]; if (self) UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"LSCouponADView" owner:Nil options:nil] objectAtIndex:0]; view.frame = CGRectMake(0, 0, CGRectGetWidth(frame), CGRectGetHeight(frame));; [自我添加子视图:视图]; 返回自我; @waterKnight 赞成/接受将是激励 :)

以上是关于指定初始化程序缺少对超类的指定初始化程序的超级调用的主要内容,如果未能解决你的问题,请参考以下文章

Swift:“必须调用超类的指定初始化程序”错误,即使代码正在这样做

必须调用超类“UICollectionView”的指定初始化程序

Swift - 必须调用超类 SKSpriteNode 错误的指定初始化程序

什么时候一个类会有多个指定的初始化器?

Swift4 中 MKPolygon 的指定初始化程序是啥?

如果一个类没有记录的指定初始化程序怎么办?