如何为分组样式的 UITableViewController 创建指定的 init?

How can I create a designated init for a grouped style UITableViewController?

我有这个 UITableViewController 子class:

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:)。但这并没有在我的 class 中实现,因此该应用程序将因 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 的目的。所以我不想这样做。


我做错了什么?我必须做什么才能使用我自己的初始化程序?

最好的解决办法当然是调用指定的初始化器。但是要获得分组样式的 TableView,您必须使用 nib 文件。

这个 nib 包含一个分组的 UITableView。 nib 文件的文件所有者是一个 UITableViewController。它的视图出口连接到 UITableView。非常简单。

然后我们可以使用下面的代码作为我们的初始化方法:

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)
    }
}

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