初始化程序未覆盖其超类的指定初始化程序。

43

我刚刚升级到Xcode 6.3 Beta 3,出现了很多关于以下内容的错误:

初始化程序未覆盖其超类的指定初始化程序。

override init() {
    super.init()
}

例如,这是一个UIButton类:

class CustomButton: UIButton {

    var target: AnyObject!
    var selector: Selector!
    var action: (() -> Void)!

    override init() { // Initializer does not override a designated initializer from its superclass
        super.init() // Must call a designated initializer of the superclass 'UIButton'
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
    }
}

这是我的一个UIViewController类:

class CustomAlertView: UIViewController {

    required init(coder aDecoder: NSCoder) {
        fatalError("NSCoding not supported")
    }

    required override init() { // Initializer does not override a designated initializer from its superclass
        super.init() // Must call a designated initializer of the superclass 'UIViewController'
    }

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }
}
5个回答

49

我的解决方案是一个快速修复,但我认为比苹果在发布说明中提出的解决方案更简单。有关更多信息,请搜索19775924http://adcdownload.apple.com//Developer_Tools/Xcode_6.3_beta_3/Xcode_6.3_beta_3_Release_Notes.pdf。苹果表示,您需要创建一个Objective-C文件并扩展它(必须将其添加到头文件等),并且这是“Xcode 6.3 beta 3中已知问题”,因此我认为执行我所做的操作很容易:

以下是我如何为UIButton解决此问题:

class CustomButton : UIButton {
    init() {
        super.init(frame: CGRectZero)
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

这是我的一个视图控制器之一(如果不需要,请删除public):

public class GenericViewController: UIViewController {
    public init() {
        super.init(nibName: nil, bundle: nil)
    }

    required public init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

我不使用IB(Interface Builder),因此我也有UIView,因为我将视图与viewController分开(如果不需要,请删除public):

public class GenericMenuView: UIView {
    public init() {
        super.init(frame: CGRectZero)
    }

    public required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

因为我在所有的子类中都覆盖了一个名为 setupViews 的方法,并且该方法会在初始化时被调用,所以我特别需要这个。而且使用 AutoLayout,我不需要任何框架(因此我不会使用带有框架参数的 init 方法)。

所以看起来你必须放弃 override。哦!而且一定不要调用 self.init(),否则该类将永远无法初始化(并在一些内部超时后崩溃)。


8
依据苹果文档这里所述,您正在覆盖一个方便的初始化器。因此,为使您的初始化器正常工作,您需要更改该方法。
override convenience init() {
    super.init()
}

你可以这样做,或者如果你只是调用超类的初始化程序而不真正使用它,则可以删除初始化程序。

3

我最近弄清了这个问题,我想解释一下问题所在。原始答案发布在Apple开发者论坛上。

看起来Swift已经改变了初始化程序依赖性检查或导入初始化程序的策略。

现在,如果你的初始化程序如下所示,处理Xcode 6.3 Beta 2和Beta 3的一种方法是删除所有初始化程序定义:

class CustomButton: UIButton {

    var target: AnyObject!
    var selector: Selector!
    var action: (() -> Void)!    
}

class CustomAlertView: UIViewController {

}

没有定义任何指定的初始化程序,类继承其超类的所有初始化程序。

这个问题很容易解决,但是有一个大坑,让我困惑了一段时间。


3

我认为这比看起来要容易得多。

对于一个SKSpriteNode,我正在做这个:

override init() {
    let texture = SKTexture(imageNamed: "bgTile")
    super.init(texture: texture, color: nil, size: texture.size())
}

问题是init()不是SKSpriteNode的指定初始化程序。所以我只是将其更改为:
override init(texture: SKTexture!, color: UIColor!, size: CGSize) {
    let texture = SKTexture(imageNamed: "bgTile")
    super.init(texture: texture, color: nil, size: texture.size())
}

现在它运行良好。

1
解决方案:Override init(coder aDecoder: NSCoder!)不像预期的那样工作 - Swift
这对我起作用,试试这个,注意:你必须唤醒nib。
override func awakeFromNib() {

     super.awakeFromNib()
    // Initialisation code

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接