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

时间:2015-02-07 23:56:26

标签: ios uitableview swift

我有这个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的目的。所以我不想这样做。


我做错了什么?为了能够使用我自己的初始化程序,我该怎么办?

1 个答案:

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

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