'required'initulator'init(coder :)'必须由UIViewController

时间:2015-10-20 14:13:10

标签: ios swift cocoa-touch

我知道还有其他类似的问题,但没有回答我的问题。

所以我有一个在XIB中定义布局的ViewController。从另一个ViewController我想做这样的事情

let destVc = DestViewController(model:someModelData)
self.showViewController(destVc,...)

和DestViewController定义如下:

class DestViewController : UITableViewController {
    var model: SomeModelData {
        didSet {
            self.tableView.reloadData()
        }
    }

    init(model: SomeModelData) {
        self.model = model
        super.init(style: .Plain)

    }

   //...implementation below
}

我想这样做的原因是因为

1)我不想为这个视图控制器肯定需要的模型数据使用选项或隐式解包的选项,实际上这个模型数据构成了合同的一部分

2)这让我了解了在初始化程序中拥有模型的另一个好处,它为任何想要创建其中一个ViewControllers的人定义了一个明确的契约,并由swift的强类型系统强化。

问题是这不会编译,xcode说:

 'required' initializer 'init(coder:)' must be provided by subclass of UIViewController

这真的很奇怪,因为在UIViewController的文档中它没有将init(编码器)声明为“必需的”初始化器,它是一个指定的初始化器,但是在swift manual中没有说明我的地方必须覆盖指定的初始化者只需要的。

这里发生了什么我需要添加:

required init?(coder aDecoder: NSCoder) {

}

要使其有效吗?

请注意,当我点击它时,UITableViewController的swift doc出现在xcode中。请注意在initWithCoder

之前缺少的'required'
public class UITableViewController : UIViewController, UITableViewDelegate, UIScrollViewDelegate, UITableViewDataSource {

    public init(style: UITableViewStyle)
    public init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)
    public init?(coder aDecoder: NSCoder)

    public var tableView: UITableView!
    @available(iOS 3.2, *)
    public var clearsSelectionOnViewWillAppear: Bool // defaults to YES. If YES, any selection is cleared in viewWillAppear:

    @available(iOS 6.0, *)
    public var refreshControl: UIRefreshControl?
}

1 个答案:

答案 0 :(得分:5)

如果你覆盖任何一个"指定"初始化程序,虽然您不会继承任何其他指定的初始化程序。但是因为UIView采用了NSCoding协议,

需要init(编码器:)初始化程序。这就是您需要实施init(coder:)

的原因
init(coder decoder: NSCoder) {
    super.init(coder: decoder)
}