致命错误:使用未实现的初始化程序&#init;(编码器:)'上课

时间:2014-06-04 11:38:18

标签: ios macos uiviewcontroller swift

我决定用Swift继续我剩下的项目。当我将自定义类(UIViewcontroller的子类)添加到我的故事板视图控制器并加载项目时,应用程序突然崩溃并出现以下错误:

  

致命错误:使用未实现的初始化程序" init(编码器:)'对于班级

这是一段代码:

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.
    }
    */
}

请提出建议

6 个答案:

答案 0 :(得分:199)

问题

这是由目标init?(coder aDecoder: NSCoder)上缺少初始值设定项UIViewController引起的。该方法是必需的,因为从UIViewController实例化UIStoryboard会调用它。

要了解我们如何从UIViewController初始化UIStoryboard,请查看here

为什么这不是Objective-C的问题?

因为 Objective-C 会自动继承所有必需的UIViewController初始值设定项。

为什么Swift不会自动继承初始值设定项?

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将继承超类中所有必需的初始值设定项,因为 Dave Wood 指向下面的answer


答案 1 :(得分:26)

除了@ 3r1d之外的另一个选择是从你的类中删除以下init方法:

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

包含该init方法,可防止子类从其超类继承init(coder aDecoder: NSCoder!)。如果不包括它,你的班级将继承它们。

注:参见WWDC 2014 Session 403" Intermediate Swift"在大约33:50的标记处了解更多细节。

答案 2 :(得分:9)

对于与swift UICollectionViewCells存在相同问题的人,请将@ 3r1d建议的代码添加到自定义UICollectionViewCell类,而不是添加到View Controller:

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

答案 3 :(得分:3)

对于那些需要Swift代码的人:

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

[编辑]这是针对Swift的旧版本。可能不再工作了。

答案 4 :(得分:1)

我在程序化collectionView单元中遇到了这个问题,即使操作人员正在询问有关vc的问题,但在寻找答案时我仍然落在这个问题上。对我来说,问题是我确实有

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

已实现,因此最佳答案不起作用。我在单元格中没有的是初始化程序:

// my programmatic cell was missing this
override init(frame: CGRect) {
    super.init(frame: frame)
}

一旦我添加了它,错误就消失了

答案 5 :(得分:0)

我没有添加一些使内部机制正常工作的方法,而是将我的属性定义为@lazy并在类范围内初始化它们。