我在Swift中继承了一个UITableViewController并添加了一个自定义初始化器:
init(scheduleController: ScheduleController) {
self.scheduleController = scheduleController
super.init(style: UITableViewStyle.Plain)
self.title = "Routes"
}
现在,当我启动应用程序时,它崩溃了:
fatal error: use of unimplemented initializer 'init(nibName:bundle:)' for class 'Shuttle_Plan.RoutesViewController'
如何在不添加此初始化程序的情况下解决此问题?
答案 0 :(得分:4)
疯了,不是吗?但错误消息告诉您该怎么做:如果您要打电话给super.init(style:)
,然后您还必须实施init(nibName:bundle:)
,即使所有你这样做是为了致电super
:
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName:nibNameOrNil, bundle:nibBundleOrNil)
}
然而,这提出了如何处理财产的问题。除非初始化所有未初始化的属性,否则Swift不允许您实现init(nibName:bundle:)
。
一个明显的解决方案是使您的属性成为Optionals;现在上面显示的实现是合法的。在init(scheduleController:)
中,您必须在调用super.init
之后初始化您的属性。
不那么引人注目,请将您的媒体资源设为var
,而不是可选。现在多次初始化:在所有初始化程序中super.init
之前,以及super.init
中 init(scheduleController:)
之后的。
然而,这些都不是我在自己的代码中使用的解决方案。在我的代码中,我正在做不调用super.init(style:)
,而是调用super.init(nibName:bundle:)
。这是因为:
默认样式为.Plain
,这是您想要的
即使您想要的是.Grouped
,也可以在关联的nib文件中指定
这种方法的最大优点是它允许您的属性成为非可选let
,这可能是您真正想要做的。