1. ホーム
  2. ios

[解決済み] イニシャライザーがスーパークラスから指定されたイニシャライザーをオーバーライドしていない

2022-02-18 22:40:46

質問

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)
    }
}

解決方法は?

私の解決策は、迅速な修正ですが、Appleがリリースノートで目的としているものよりも簡単だと思います。詳細については、19775924を検索してください。 http://adcdownload.apple.com//Developer_Tools/Xcode_6.3_beta_3/Xcode_6.3_beta_3_Release_Notes.pdf こちらです。Appleが言っているのは、Objective-Cのファイルを作ってそれを拡張する(ヘッダーファイルなどに追加する必要がある)ということで、"Known Issues in 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を削除)。

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を使用して、私はフレームを必要としません(だから、私はフレームパラメータでinitをオーバーライドしません)。

ということは override . ああ!そして、必ず self.init() でないとクラスは初期化されません(そして内部タイムアウトでクラッシュします)。