为了账号安全,请及时绑定邮箱和手机立即绑定

致命错误:在课堂上使用未实现的初始化程序'init(coder :)'

致命错误:在课堂上使用未实现的初始化程序'init(coder :)'

iOS
月关宝盒 2019-09-19 10:34:02
我决定用Swift继续我剩下的项目。当我将自定义类(子类UIViewcontroller)添加到我的storyboard视图控制器并加载项目时,应用程序突然崩溃并出现以下错误:致命错误:在课堂上使用未实现的初始化程序'init(coder :)'这是一个代码:import UIKitclass 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.    }    */}请提出建议
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

问题

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


看看我们如何初始化一个UIViewController从UIStoryboard,请大家看看这里


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

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


为什么Swift不会自动继承初始化器?

默认情况下,Swift由于安全性而不继承初始值设定项。但是如果所有属性都有值(或可选)并且子类没有定义任何指定的初始化器,它将继承超类中的所有初始化器。


1.第一种方法

手动实现init?(coder aDecoder: NSCoder)目标UIViewController


required init?(coder aDecoder: NSCoder) {

    super.init(coder: aDecoder)

}

2.第二种方法

正如Dave Wood在下面的回答中指出的那样,删除init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)目标UIViewController将继承超类中所需的所有初始值设定项


查看完整回答
反对 回复 2019-09-19
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

除了@ 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。


查看完整回答
反对 回复 2019-09-19
?
ITMISS

TA贡献1871条经验 获得超8个赞

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


init(coder aDecoder: NSCoder!)

{

    super.init(coder: aDecoder)

}


查看完整回答
反对 回复 2019-09-19
  • 3 回答
  • 0 关注
  • 622 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信