Swift - 以编程方式添加UITableViewCell无法正常工作

时间:2015-01-09 06:34:10

标签: ios uitableview swift

我有这段代码:

class Cell:UITableViewCell {
    var fullName:UILabel! = UILabel()
    var userImage:UIImage! = UIImage()

    override func awakeFromNib() {
        super.awakeFromNib()
        println("wake")
        fullName.setTranslatesAutoresizingMaskIntoConstraints(false)
        contentView.addSubview(fullName)
        let imageView = UIImageView(image: userImage)
        contentView.addSubview(imageView)
        var viewsDict = [
            "fullName" : fullName,
            "userImage" : userImage
        ]

        contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[userImage(10)]", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDict))
        contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[fullName]-[userImage(10)]-|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDict))
    }
}

viewDidLoad中:

var tableView = UITableView()
tableView.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height-64)
tableView.delegate = self
tableView.dataSource = self
var cell = Cell.self
tableView.registerClass(cell, forCellReuseIdentifier: "cell")
self.view.addSubview(tableView)

的cellForRowAtIndexPath:

let cell:Cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as Cell
cell.fullName.text = testarray.objectAtIndex(indexPath.row) as? String
return cell

当我执行代码时,我无法在单元格中看到标签,即使在类Cell中没有println(" wake")也没有执行。

2 个答案:

答案 0 :(得分:0)

仅当从笔尖或故事板加载对象时才会调用

awakeFromNib。你没有这样做,因为一个班级已经注册。

您需要将该代码移动到出口方法的UITableView文档中提到的initWithStyle:reuseIdentifier方法:

  

如果您为指定的标识符注册了类,并且必须创建新的单元格,则此方法通过调用其initWithStyle:reuseIdentifier:方法来初始化该单元格。对于基于nib的单元格,此方法从提供的nib文件

加载单元格对象

答案 1 :(得分:0)

您的自定义UITableViewCell应如下所示:

class ListTableViewCell: UITableViewCell {

    var lblTitle = UILabel()

    override init(style: UITableViewCellStyle, reuseIdentifier: String!) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        lblTitle = UILabel(frame: CGRectZero)
        lblTitle.font = UIFont(name: "HelveticaNeue-Light", size: 18.0)
        lblTitle.textAlignment = NSTextAlignment.Right
        lblTitle.numberOfLines = 1
        lblTitle.backgroundColor = UIColor.clearColor()
        lblTitle.textColor = UIColor(red: 130/255, green: 137/255, blue: 141/255, alpha: 1.0)
        self.contentView.addSubview(self.lblTitle)
        // 130 137 141
        self.separatorInset = UIEdgeInsets(top: 0, left: 100, bottom: 0, right: -100)

    }

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

    override func layoutSubviews() {

        var marginX = CGFloat(30.0)
        var marginY = CGFloat(0.0)
        var width = CGFloat(320)
        var height = self.contentView.frame.size.height

        self.lblTitle.frame = CGRectMake(marginX, marginY, width, height)
    }

}

这就是您在cellForRowAtIndexPath数据源的UITableView方法中创建单元格的方法。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell:ListTableViewCell! = tableView.dequeueReusableCellWithIdentifier(self.cellIdentifier) as? ListTableViewCell

        if (cell == nil) {
            cell = ListTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: self.cellIdentifier)
        }
        cell.lblTitle.text = self.listItems[indexPath.row]
        return cell
    }