【问题标题】:'required' initializer 'init(coder:)' must be provided by subclass of UIViewController'required' 初始化器 'init(coder:)' 必须由 UIViewController 的子类提供
【发布时间】: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


    【解决方案1】:

    如果你重写任何类的“指定”初始化器,尽管你没有继承任何其他指定初始化器。但是因为UIView采用了NSCoding协议,

    这需要一个 init(coder:) 初始化程序。这就是为什么你需要实现init(coder:)

    init(coder decoder: NSCoder) {
        super.init(coder: decoder)
    }
    

    【讨论】:

    • NScoding 协议没有说这个初始化器是必需的,如果我的超类提供了它,为什么我需要这样做?
    • 如果有一天有人将你的类子类化......并且如果该类实例是使用 init(coder) 初始化的,编译器将具有要执行的层次结构
    猜你喜欢
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多