以编程方式将 UILabel 添加到自定义 tableViewCell

Posted

技术标签:

【中文标题】以编程方式将 UILabel 添加到自定义 tableViewCell【英文标题】:Adding UILabel to a custom tableViewCell programmatically 【发布时间】:2016-03-10 21:59:45 【问题描述】:

我正在尝试以编程方式将标签添加到自定义表格视图单元格。该应用程序仍会因“意外发现 nil”而崩溃。我在这里查看了其他帖子,但我看不出我做错了什么。详情请看代码。

import UIKit

class MyTableViewCell: UITableViewCell 

  var titleLabel: UILabel!

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

    titleLabel = UILabel()
    titleLabel.textColor = UIColor.blackColor()
    titleLabel.font = UIFont.systemFontOfSize(17)
    titleLabel.frame = CGRect(x: 40.0, y: 2, width: bounds.width, height: bounds.height)
    addSubview(titleLabel)
  

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


在视图控制器内部:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCellWithIdentifier("CustomCell", forIndexPath: indexPath) as! MyTableViewCell
    // Crashes the app with: 'fatal error: unexpectedly found nil while unwrapping an Optional value'
    cell.titleLabel.text = "Some text"

自定义表格视图类已正确分配给情节提要中的原型单元格。

如果我将MyTableViewCell 中的声明更改为var titleLabel = UILabel() 并从init() 中删除该行,表格视图将显示,但我的标签不会显示。 不过,代码对我来说看起来不错,关于我可能在这里遗漏的任何建议?

【问题讨论】:

我会让titleLabel 属性使用let。然后,您可以在调用 super.init(...) 之前对其进行初始化。最好尽可能避免隐式展开的可选项,因为它可以让您获得遇到的确切错误。 另外,你在注册你的单元类吗?你需要调用registerClass:forCellReuseIdentifier:,否则dequeue方法会失败。 感谢您的帮助!我现在确实在viewDidLoad() 中添加了该行:tableView.registerClass(ListTableViewCell.self, forCellReuseIdentifier: "SongItem") 它做到了这一点!我之前用自定义单元格调用过它,虽然没有问题,但是我没有创建一个标签作为单元格的属性。但是,此解决方案有一个副作用:现在编译器对我在情节提要中添加的其他标签的引用不满意并使用viewWithTag()。它是编程方式还是一个单元格的情节提要? 我通常按照您的描述进行初始化,但是按照您的建议更改标签的初始化将使 Xcode 抱怨 super.init(coder: aDecoder) 并出现错误:'Property 'self.titleLabel' not initialized at super.init 调用'。这就是为什么我把它转向这个。另外,如果您作为答案发布,我可以接受! 【参考方案1】:

您在storyboard中创建了自定义单元格,因此您不需要为表格视图注册类。并且来自storyboard的视图将调用initWithCoderawakeFromNib,请在这两个函数中添加标签。

【讨论】:

我没有找到initWithCoder() 的方法,但是在awakeFromNib() 中设置标签就可以了。但为此,我必须在故事板中设置标签并在我的自定义单元类中添加一个 IBOutlet 并将其连接到故事板单元中的标签。谢谢!

以上是关于以编程方式将 UILabel 添加到自定义 tableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

将 UILabel 添加到自定义 UICollectionViewCell 不会出现在 cellForItemAtIndexPath 中

以编程方式将 UILabel 添加到 CollectionViewCells

以编程方式将 UILabel 添加到 UICollectionViewCell

以编程方式将 UILabel 添加到工具栏

以编程方式将点击手势添加到 UILabel

以编程方式将 UILabel 添加到集合单元,快速