Initializer不会覆盖其超类中的指定初始值设定项

时间:2015-03-13 11:38:29

标签: ios swift uiviewcontroller initializer

所以我刚刚升级到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 个答案:

答案 0 :(得分:42)

我的解决方案是一个快速解决方案,但我认为比发布说明中Apple的目的更容易。有关更多信息,请在此处搜索19775924 http://adcdownload.apple.com//Developer_Tools/Xcode_6.3_beta_3/Xcode_6.3_beta_3_Release_Notes.pdf。 Apple所说的是你创建一个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")
    }
}

这是我的一个ViewControllers(如果不需要,则删除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,所以我也有UIView,因为我将视图与viewController分开(如果不需要则删除公开):

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

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

我在视图中特别需要这个,因为我有一个setupViews方法,我在init中调用的所有子类中都会覆盖它。使用AutoLayout我不需要任何帧(因此我不会用frame参数覆盖init)。

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

答案 1 :(得分:4)

根据Apple文档here,您要覆盖的是便捷初始化程序。因此,要使初始化程序正常工作,您必须将方法更改为

override convenience init() {
    super.init()
}

除了调用超类初始化程序之外,你可以这样做,或删除初始化程序,如果你没有真正使用它。

答案 2 :(得分: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())
}

现在工作正常。

答案 3 :(得分:1)

我最近想出了这个,我想解释一下问题是什么。最初在Apple Developer forums上回答。

似乎Swift已经改变了初始化程序依赖性检查或冒充初始化程序的策略。

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

class CustomButton: UIButton {

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

class CustomAlertView: UIViewController {

}

在没有定义任何指定的初始值设定项的情况下,类继承其超类的所有初始值设定项。

一个非常简单的修复方法,但是让我感到难过的一大问题。

答案 4 :(得分:1)

错误解决方案:覆盖init(编码器aDecoder:NSCoder!)无法正常工作 - Swift

这对我有用,试试这个,注意:你必须唤醒笔尖

override func awakeFromNib() {

     super.awakeFromNib()
    // Initialisation code

}