自定义 UITableviewCell IBOutlet 始终为零

Kyl*_*lan 8 storyboard uitableview ios swift

我有一个自定义 UITableViewCell 子类,其中包含一个用于 UILabel 的简单 IBOutlet 设置。

class SegmentCell: UITableViewCell {

    @IBOutlet weak var test: UILabel!

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        test.text = "Some Text"
    }

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

}
Run Code Online (Sandbox Code Playgroud)

确信我已正确设置所有内容并遵循其他答案,但 UILabel 始终为零。

视图控制器:viewDidLoad:

self.tableView.registerClass(SegmentCell.self, forCellReuseIdentifier: "Cell")
Run Code Online (Sandbox Code Playgroud)

cellForForAtIndexPath

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! SegmentCell
    return cell
}
Run Code Online (Sandbox Code Playgroud)
  • 单元格设置为自定义
  • 重用标识符正确
  • Cells 类是 SegmentCell
  • Tableview 内容是动态原型

我错过了什么?

Yod*_*ama 11

由于您使用的是 Xib 文件,因此您必须注册,

tableView.register(UINib(nibName: "yourNib", bundle: nil), forCellReuseIdentifier: "CellFromNib")
Run Code Online (Sandbox Code Playgroud)

想想,如果只注册类,系统将不知道它的 Xib。这对我来说很有效。


Cha*_* A. 3

根据您注册单元的方式,它不会从故事板或 xib 文件加载它。它将仅调用该 init 方法。您的 init 方法不会创建标签,因此它始终是nil.

您还应该使用dequeueReusableCellWithIdentifier(_:forIndexPath:)而不是dequeueReusableCellWithIdentifier(_:). 后者早于情节提要,并且会返回,nil除非您之前使用该标识符创建了一个单元格并将其返回。

最后,正在调用的 init 方法tableView不是您已实现的方法,否则应用程序test.text = ...在尝试解开nil可选值时会崩溃。

  • 那么你不应该在代码中将它注册到“tableView”,并且你可以期望“init(coder:)”被调用。 (4认同)