一尘不染

初始化程序不会覆盖其父类中的指定初始化程序

swift

因此,我刚刚升级到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)
    }
}

阅读 281

收藏
2020-07-07

共1个答案

一尘不染

我的解决方案是一种快速解决方案,但我认为它比Apple在发行说明中的​​用途要容易。有关更多信息,请在此处搜索19775924
http://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")
    }
}

这是我的ViewController之一(如果不需要,请删除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()该类或该类从未初始化(并且在某些内部超时后崩溃)。

2020-07-07