【发布时间】:2015-10-21 20:47:10
【问题描述】:
我知道还有其他类似的问题,但下面没有回答我的问题。
所以我有一个 ViewController,其布局在 XIB 中定义。从另一个 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(coder) 声明为“必需”初始化程序,它是一个指定的初始化程序,是的,但在 swift manual 中没有说我必须重写指定的初始化程序只需要那些。
这里发生了什么为什么我需要添加:
required init?(coder aDecoder: NSCoder) {
}
让它发挥作用?
注意这里是当我 cmd 单击它时出现在 xcode 中的 UITableViewController 的 swift 文档。注意 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?
}
【问题讨论】:
标签: ios swift cocoa-touch