我怎样才能创build一个指定的初始化分组样式UITableViewController?

我有这个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错误fatal error: use of unimplemented initializer 'init(nibName:bundle:)' for class

显然正确的方法是调用指定的初始化程序。 不幸的是, super.init(nibName: nil, bundle: nil)会创build一个普通样式的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的目的。 所以我不想这样做。


我究竟做错了什么? 我需要做些什么才能够使用我自己的初始化程序?

当然,最好的解决scheme是调用指定的初始化程序。 但要获得一个分组样式表视图,你必须使用一个nib文件。

这个笔尖包含一个分组的UITableView。 nib文件的文件所有者是一个UITableViewController。 它的视图sockets连接到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) } } 

这不是很优雅,但它完成了工作。