1. ホーム
  2. ios

[解決済み] 致命的なエラー:クラスの未実装イニシャライザー 'init(coder:)' を使用しています。

2022-04-27 23:06:04

質問

残っているプロジェクトをSwiftで継続することにしました。私はカスタムクラス(のサブクラス)を追加したとき、私はそれを使用することができます。 UIViewcontroller をストーリーボードのビューコントローラに追加してプロジェクトをロードすると、以下のエラーでアプリが突然クラッシュしてしまいます。

fatal error: use of unimplemented initializer 'init(coder:)' for class

これはコードです。

import UIKit

class TestViewController: UIViewController {

    init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        // Custom initialization
    }

    override func viewDidLoad() {
        super.viewDidLoad()
              // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    /*
    // #pragma mark - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    }
    */
}

何かご提案ください

解決方法は?

課題

この現象は、イニシャライザーである init?(coder aDecoder: NSCoder) ターゲット上の UIViewController . このメソッドが必要な理由は UIViewController から UIStoryboard が呼び出す。

をどのように初期化するかを見るために UIViewController から UIStoryboard をご覧ください。 こちら

なぜObjective-Cでは問題ないのか?

なぜなら Objective-C は自動的に、必要なすべての UIViewController の初期化子です。

なぜSwiftは自動的にイニシャライザを継承しないのですか?

スウィフト は、デフォルトでは安全性のためにイニシャライザを継承しません。しかし、すべてのプロパティが値(またはオプション)を持ち、サブクラスが指定されたイニシャライザを定義していない場合、スーパークラスからすべてのイニシャライザを継承します。


解決方法

1. 第一の方法

手動で実装する init?(coder aDecoder: NSCoder) ターゲット上で UIViewController

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


2. 第二の方法

削除する init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) ターゲット上で UIViewController は、必要なイニシャライザをすべてスーパークラスから デイブウッド で指摘したように 回答 以下