以编程方式在Swift中自定义UITableViewCell

时间:2015-01-02 22:41:50

标签: ios swift

我希望以编程方式在Swift中创建一个UITableView和相应的自定义UITableViewCell。表格视图效果很好,但它看起来并不像单元格标签实例化 - 它们以零形式返回。

在调整元素大小时,我也不知道如何引用内容视图大小。

的UITableViewCell

import UIKit

class BusUITableViewCell: UITableViewCell {

    var routeNumber: UILabel!
    var routeName: UILabel!

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

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


    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        routeName = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 50)) // not sure how to refer to the cell size here

        contentView.addSubview(routeNumber)
        contentView.addSubview(routeName)
    }

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

        // Configure the view for the selected state
    }

}

UITableView委托和来源

import Foundation
import UIKit

class BusUITableView: NSObject, UITableViewDelegate, UITableViewDataSource {

    var routeService: RouteService = RouteService()

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        var busRoutes: [Route] = routeService.retrieve()
        return busRoutes.count
    }

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

        var cell:BusUITableViewCell = tableView.dequeueReusableCellWithIdentifier("cell") as BusUITableViewCell

        var busRoutes: [Route] = routeService.retrieve()

        cell.routeName.text = "test"  // test string doesn't work, returns nil
        return cell
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {


    }

}

查看控制器

    mainTableView.registerClass(BusUITableViewCell.self, forCellReuseIdentifier: "cell")

2 个答案:

答案 0 :(得分:4)

如果您没有链接到故事板中的原型单元格,那么您需要使用registerClass(_ cellClass: AnyClass, forCellReuseIdentifier identifier: String)

针对您的tableView注册您的单元格的类

在你的情况下你会使用这样的东西

  tableview.register(BusUITableViewCell.self, forCellReuseIdentifier:"cell")

此外,如果没有NIB文件,则不会调用awakeFromNib

编辑:.registerClass()已重命名为.register()

答案 1 :(得分:0)

考虑到你是在做这个"以编程方式" (没有nib文件),你的awakeFromNib()永远不会调用。您可以创建一个nib,并将其链接到此支持文件,并仍然以编程方式创建和使用该单元。或者......选择一个不同的地方(如初始化程序)来创建子单元并将其添加到单元格中。