自定义UITableviewCell IBOutlet始终为零

时间:2015-10-22 18:17:05

标签: ios swift uitableview storyboard

我有一个自定义的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")
    }

}

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

的ViewController: viewDidLoad中:

self.tableView.registerClass(SegmentCell.self, forCellReuseIdentifier: "Cell")

cellForForAtIndexPath

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

我错过了什么?

6 个答案:

答案 0 :(得分:1)

UITableViewCell 类和 ContentView 类不能相同。

答案 1 :(得分:0)

根据您注册单元格的方式,它不会从storyboard或xib文件加载它。它只会调用init方法。您的init方法不会创建标签,因此它始终为>>> sentence='i cant sleep what should i do' >>> phrase='cant sleep' >>> ' '.join(get_word_window(sentence,phrase,2,2)) 'i cant sleep what should'

您还应该使用nil代替dequeueReusableCellWithIdentifier(_:forIndexPath:)。后者在故事板之前,将返回dequeueReusableCellWithIdentifier(_:),除非您之前已创建具有该标识符的单元格并将其返回。

最后,nil调用的init方法不是您实现的方法,或者在尝试解包tableView可选项时,应用程序会在test.text = ...上崩溃。< / p>

答案 2 :(得分:0)

您应该先在viewDidLoad函数中注册它。

<canvas id="myChart" width="400" height="400"></canvas>
<script>
var ctx = document.getElementById("myChart").getContext('2d');
var myChart = new Chart(ctx, {
    type: 'bar',
    data: {
        labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
        datasets: [{
            label: '# of Votes',
            data: [12, 19, 3, 5, 2, 3],
            backgroundColor: [
                'rgba(255, 99, 132, 0.2)',
                'rgba(54, 162, 235, 0.2)',
                'rgba(255, 206, 86, 0.2)',
                'rgba(75, 192, 192, 0.2)',
                'rgba(153, 102, 255, 0.2)',
                'rgba(255, 159, 64, 0.2)'
            ],
            borderColor: [
                'rgba(255,99,132,1)',
                'rgba(54, 162, 235, 1)',
                'rgba(255, 206, 86, 1)',
                'rgba(75, 192, 192, 1)',
                'rgba(153, 102, 255, 1)',
                'rgba(255, 159, 64, 1)'
            ],
            borderWidth: 1
        }]
    },
    options: {
        scales: {
            yAxes: [{
                ticks: {
                    beginAtZero:true
                }
            }]
        }
    }
});
</script>

答案 3 :(得分:0)

在将自定义单元格类添加到位于Storyboard中的tableview中的单元格之后,我遇到了同样的问题。 我也注册单元格,就像在文档中一样。但现在我解决了我的问题。

“我再次删除了注册和检查单元格,所有IBOutlets都已初始化”

答案 4 :(得分:0)

由于您是uisg Xib文件,因此必须向进行注册,

tableView.register(UINib(nibName: "yourNib", bundle: nil), forCellReuseIdentifier: "CellFromNib")

想想,如果仅在class上注册,系统将不知道其Xib。对我来说这是有用的。

答案 5 :(得分:0)

我认为基本上在初始化时尚未设置网点。如果您想到达网点并对其进行操作,请覆盖didMoveToSuperview或类似内容并在其中进行。例如,这是我进入单元格中按钮出口所要做的:

open class MyTableViewCell: UITableViewCell {
    // Top stack view, not the inner one.
    @IBOutlet weak var stackView: UIStackView!
    @IBOutlet weak var buttonView: UIButton?

    open override func didMoveToSuperview() {
        buttonView?.titleLabel?.adjustsFontForContentSizeCategory = true
    }

    func adjustForAccessibilityCategory(accessible: Bool) {
        if accessible {
            stackView.axis = .vertical
            stackView.alignment = .leading
            stackView.spacing = 2
        } else {
            stackView.axis = .horizontal
            stackView.alignment = .center
            stackView.spacing = 20
        }
    }

    open override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        if #available(iOS 11.0, *) {
            adjustForAccessibilityCategory(accessible: traitCollection.preferredContentSizeCategory.isAccessibilityCategory)
        }
    }
}