所以我为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会抱怨,然后当我尝试使用初始化程序时编码器抱怨我使用的是编码器。
尽管存在这种明显的矛盾,但我相信所有这一切都是因为我在某个地方成为笨蛋。
有没有人能够指出我正确的方向?
答案 0 :(得分:1)
您需要注册class
本身而不是它的实例。
例如
tableView?.registerClass(customCell.self, forCellReuseIdentifier:"cell")
需要init(coder aDecoder:NSCoder)
的问题是另一个问题,在此讨论:'required' initializer 'init(coder:)' must be provided by subclass of 'UITableViewCell'`