我有这个UITableViewController子类:
class MyTableViewController: UITableViewController {
let foo: String
init(foo: String, style: UITableViewStyle = .Grouped) {
self.foo = foo
super.init(style: style)
}
required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
}
没什么特别的,不幸的是它没有按预期工作,因为super.init(style: style)
会调用MyTableViewController(nibName:bundle:)
。但是我的课程没有实现,因此应用程序会因fatal error: use of unimplemented initializer 'init(nibName:bundle:)' for class
错误而崩溃。
显然,正确的方法是调用指定的初始值设定项。不幸的是super.init(nibName: nil, bundle: nil)
将创建一个普通样式的tableView。
我可以将let foo: String
转换为var foo: String!
并将指定的初始化程序转换为便捷初始化程序。像这样:
class MyTableViewController: UITableViewController {
var foo: String!
convenience init(foo: String, style: UITableViewStyle = .Grouped) {
self.init(style: style)
self.foo = foo
}
}
哪种方法有效,但它违背了let
的目的。所以我不想这样做。
我做错了什么?为了能够使用我自己的初始化程序,我该怎么办?
答案 0 :(得分:0)
最好的解决方案当然是调用指定的初始化程序。但是要获得Grouped Style TableView,您必须使用nib文件。
此笔尖包含一个分组的UITableView。 nib文件的文件所有者是UITableViewController。它的视图插座连接到UITableView。挺直的。
然后我们可以使用以下代码作为init方法:
init(foo: String, style: UITableViewStyle = .Grouped) {
self.foo = foo
if style == .Grouped {
super.init(nibName: "GroupedTableViewController", bundle: nil)
}
else {
super.init(nibName: nil, bundle: nil)
}
}
它不是很优雅,但它完成了工作。