Swift Custom UITableViewCell以编程方式工作并在单元格中显示,但Storyboard IBOutlet为零并且不在单元格中显示

时间:2015-03-23 05:31:07

标签: ios xcode uitableview swift

在我的自定义单元格swift文件CustomTableView.swift中,我可以通过编程方式创建TableView的标签,但是当我在Storyboard中使用IBOutlet时,标签总是为零

我非常确定我的细胞不是零

import UIKit

class CustomTableViewCell: UITableViewCell {


    @IBOutlet weak var lblPostDate: UILabel!

    var message: UILabel = UILabel()



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

        self.message.frame = CGRectMake(0, 0, 100, 40);
        self.message.backgroundColor = UIColor.brownColor()
        self.message.text = "bla bla bla bla bla"
        self.addSubview(self.message)
    }

    required init(coder aDecoder: NSCoder) {

        super.init(coder: aDecoder)

    }

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    func setCell(postDate: String)
    {
        self.lblPostDate?.text = postDate

    }

}

在上面的代码中,可以在单元格中看到消息但是lblPostDate是IBOutlet无法看到的

我确信委托和数据源以及自定义单元格标识符是什么,但似乎IBOutlets没有正确初始化。我可以看到调试时lblPostDate变为nil

这是XCode 6的错误吗?

以下是我从控制器中调用的方式

import UIKit

class HomeViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var items = ["one","two","three","four"]

    let kCellIdentifier: String = "CustomCell"

    @IBOutlet weak var mTableView: UITableView!


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.mTableView.registerClass(CustomTableViewCell.classForCoder(), forCellReuseIdentifier:kCellIdentifier)
        //self.mTableView.registerClass(CustomTableViewCell.self, forCellReuseIdentifier: kCellIdentifier)


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        var cell:CustomTableViewCell! = tableView.dequeueReusableCellWithIdentifier(kCellIdentifier, forIndexPath: indexPath)  as? CustomTableViewCell

        if (cell == nil) {

            self.mTableView.registerClass(CustomTableViewCell.classForCoder(), forCellReuseIdentifier: kCellIdentifier)
            cell = CustomTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: kCellIdentifier)
        }

        if var label = cell.lblPostDate{
            label.text = items[indexPath.row]
        }
        else{
            cell.setCell(items[indexPath.row])
        }

        return cell
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }

    func  tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 44
    }


}

2 个答案:

答案 0 :(得分:0)

您必须将lblPostDate与单元格xib文件中的一个标签链接。

答案 1 :(得分:-1)

这是疯了,我删除了寄存器类代码,它工作,我不敢相信

//self.mTableView.registerClass(CustomTableViewCell.classForCoder(), forCellReuseIdentifier:kCellIdentifier)

在我的Controller中注释掉registerClass之后,它不再调用init函数,而是正确地创建了lblPostDate

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

        self.message.frame = CGRectMake(0, 0, 100, 40);
        self.message.backgroundColor = UIColor.brownColor()
        self.message.text = "bla bla bla bla bla"
        self.addSubview(self.message)
    }

所以我不再需要创建硬代码输入对象了。

有趣的是,所有教程,他们建议注册课程的所有地方。无论如何,它有效!