自定义Swift单元格:使用编程方式创建的UITableView

8
我将尝试在通过编程方式创建的UITableView中使用自定义的TableViewCell类,但是我无法弄清楚为什么这不能正常工作。我以前使用过自定义的TableViewCell类几次,没有遇到任何问题(在Storyboard中设置了类名),但是这里我没有Storyboard来设置应该用于生成单元格的类。我正在执行以下操作:
override func viewDidLoad() {
    ...
    self.popupTableView.registerClass(CustomTableViewCellPopup.self, forCellReuseIdentifier: "popupTableViewCell")
    ...
}


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCellWithIdentifier("popupTableViewCell") as CustomTableViewCellPopup
    ...
    return cell
}

class CustomTableViewCellPopup: UITableViewCell {

    var message: UILabel = UILabel()

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }

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

    override func awakeFromNib() {
        super.awakeFromNib()

        println("I'm running!")
        self.message.frame = CGRectMake(0, 0, 10, 10);
        self.message.backgroundColor = UIColor.brownColor()
        self.addSubview(self.message)
    }

}

println()输出从未出现。 TableView在没有额外UILabel(消息)的情况下呈现。就像一个开箱即用的UITableViewCell。

同样地(不使用registerClass()),我可以从故事板中运行具有自定义单元格的TableView(Classname直接在Storyboard Inspector中定义)而没有任何问题。

你有想法为什么自定义类没有被使用吗?

2个回答

39

awakeFromNib方法只有在从xib或storyboard加载单元格时才会被调用。将你的自定义代码从awakeFromNib移动到initWithStyle:reuseIdentifier:方法中,因为当你调用tableView的dequeueReusableCellWithIdentifier:方法时,它使用的是这个初始化方法。


3
您看不到println输出,因为它在awakeFromNib中,在此仅在单元格来自storyboard或XIB时才会调用。在这里,您只是向表格注册类,因此没有Nib加载。尝试从tableView:cellForRowAtIndexPath:中调用configure cell,而不是在awakeFromNib中配置。
initWithCoder也不会被调用,原因相同-请尝试重写initWithStyle:reuseIdentifier:。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接