Luk*_*Feo 4 cocoa-touch ios swift
我知道还有其他类似的问题但没有回答我的问题.
所以我有一个ViewController,其布局在XIB中定义.从另一个ViewController我想做这样的事情
let destVc = DestViewController(model:someModelData)
self.showViewController(destVc,...)
Run Code Online (Sandbox Code Playgroud)
和DestViewController的定义如下:
class DestViewController : UITableViewController {
    var model: SomeModelData {
        didSet {
            self.tableView.reloadData()
        }
    }
    init(model: SomeModelData) {
        self.model = model
        super.init(style: .Plain)
    }
   //...implementation below
}
Run Code Online (Sandbox Code Playgroud)
我想这样做的原因是因为
1)我不想为这个视图控制器肯定需要的模型数据使用选项或隐式解包的选项,实际上这个模型数据构成了它的合同的一部分
2)这让我了解了在初始化程序中拥有模型的另一个好处,它为任何想要创建其中一个ViewControllers的人定义了一个明确的契约,由swift的强类型系统强化.
问题是这不会编译,xcode说:
 'required' initializer 'init(coder:)' must be provided by subclass of UIViewController
Run Code Online (Sandbox Code Playgroud)
这真的很奇怪,因为在UIViewController的文档中它并没有将init(编码器)声明为"必需的"初始化器,它是一个指定的初始化器,但是在swift手册中没有说我必须覆盖指定的初始化器只需要那些.
这里发生了什么我需要添加:
required init?(coder aDecoder: NSCoder) {
}
Run Code Online (Sandbox Code Playgroud)
为了使它工作?
请注意,这是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?
}
Run Code Online (Sandbox Code Playgroud)
    如果覆盖任何类的"指定"初始值设定项,虽然您没有继承任何其他指定的初始值设定项.但是因为UIView采用了NSCoding协议,
这需要一个init(编码器:)初始化程序.这就是你需要实施的原因init(coder:)
init(coder decoder: NSCoder) {
    super.init(coder: decoder)
}
Run Code Online (Sandbox Code Playgroud)