UITableViewCell并且无法调用' init'使用类型'(编码器:NSCoder)的参数列表'

时间:2014-11-25 11:44:34

标签: ios xcode uitableview swift

所以我为UITableView建立了一个自定义单元格类。 Xcode坚持认为这个UITableViewCell有以下初始化程序(Xcode实际上为我自动填充了这段代码):

class customCell: UITableViewCell {

    required init(coder aDecoder:NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

我修改了此初始化程序的内容以包含以下内容:

        // fatalError("init(coder:) has not been implemented")
        super.init(coder: aDecoder)

如果我删除了关键字required,那么Xcode会发出错误,并希望通过重新放入关键字来纠正我。

所以在我的UITableView课程中,我试着像这样注册这个单元格:

override func viewDidLoad(){
    super.viewDidLoad()
    let coder: NSCoder = NSCoder()
    let customCell: AnyClass = customCell(coder: coder)
    table?.registerClass(customCell, forCellReuseIdentifier:"cell")

倒数第二行(我用NSCoder初始化customCell的那个,就像Xcode想要的那样)产生错误:

Cannot invoke 'init' with an argument list of type '(coder: NSCoder)'

如果可以,我宁愿在没有NSCoder的情况下构建自己的初始化程序。

如果我尝试使用任何其他初始化程序,那么Xcode会出现以下错误:

Extra argument 'reuseIndenifier' in call

Missing argument in call

在我使用NSCoder的初始化程序之前,它会继续抱怨。我被迫使用这个初始化程序。

如果我离开这里,请纠正我,但对我而言,似乎我遇到了陷阱22的情况 - 如果我在没有编码器的情况下构建初始化程序,Xcode会抱怨,然后当我尝试使用初始化程序时编码器抱怨我使用的是编码器。

尽管存在这种明显的矛盾,但我相信所有这一切都是因为我在某个地方成为笨蛋。

有没有人能够指出我正确的方向?

1 个答案:

答案 0 :(得分:1)

您需要注册class本身而不是它的实例。

例如

tableView?.registerClass(customCell.self, forCellReuseIdentifier:"cell")

需要init(coder aDecoder:NSCoder)的问题是另一个问题,在此讨论:'required' initializer 'init(coder:)' must be provided by subclass of 'UITableViewCell'`