如何在swift中自定义UITableViewCell

时间:2016-03-30 10:54:30

标签: ios iphone swift uitableview

我是swift的新手,我尝试自定义UITableViewCell,我在youtube和互联网上看到很多教程。但我不能这样做,我试图解决很多问题,但没有任何改变。 这是我的代码:

class movieViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {

var categories = ["Action", "Drama", "Science Fiction", "Kids", "Horror"]


@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var btnMenu: UIBarButtonItem!
override func viewDidLoad() {
    super.viewDidLoad()
    btnMenu.target = self.revealViewController()
    btnMenu.action = Selector("revealToggle:")

    self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    self.revealViewController().rearViewRevealWidth = 200
    self.tableView.registerClass(CategoryRow.self, forCellReuseIdentifier: "Cell")

    // Do any additional setup after loading the view.
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return categories[section]
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return categories.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CategoryRow
    cell.labelA.text = self.categories[indexPath.row]
    cell.labelB.text = self.categories[indexPath.row]

    return cell
}

CategoryRow.swift:

    class CategoryRow: UITableViewCell {
    var labelA: UILabel!
    var labelB: UILabel!

    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
    }

}

和我的错误:

enter image description here

5 个答案:

答案 0 :(得分:3)

您尚未在标签栏中链接labelA。 Creating an Outlet Connection

答案 1 :(得分:3)

好像你没有xib。而你只是声明你的标签,但你没有初始化它。因此labelAlabelB将为零。它会崩溃。

如果你不想要xib,你必须在CategoryRow中实现两个函数,如下面的代码:

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

}

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    self.labelA = UILabel(frame: CGRectMake(0,0, self.contentView.frame.size.width, self.contentView.frame.size.height))
//Same here for labelB
    self.contentView.addSubview(labelA)
}

另一种方法是创建名称与您的类相同的xib UITableCiewCell。并设置此单元格是您的类。您可以在此xib中设计labelAlabelB,然后将其添加到类中。并在viewDidLoad

中进行修改
 self.tableView.registerNib(UINib(nibName: "nameYourxib"), forCellReuseIdentifier: "Cell")

答案 2 :(得分:1)

您尚未分配labelA或labelB。这就是为什么要显示错误。将您的标签与您的用户界面连接起来,如下所示:enter image description here

答案 3 :(得分:0)

@vien vu回答是对的,但没有XIB怎么办? Here是swift中自定义单元格的完整解决方案

答案 4 :(得分:-3)

您需要在viewDidLoad

中添加委托数据源
viewDidLoad() {
  self.tableView.delegate = self
  self.tableView.datasource = self
}

你需要通过outlet而不是变量来创建labelA和labelB。保持控制并从故事板拖动到相应的文件然后放开,选择插座并将其命名为labelA和labelB