在Swift中对UITableViewController进行子类化

时间:2015-04-24 16:58:52

标签: ios uitableview swift

我在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'

如何在不添加此初始化程序的情况下解决此问题?

1 个答案:

答案 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,这可能是您真正想要做的。