以编程方式将 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的视图将调用initWithCoder
和awakeFromNib
,请在这两个函数中添加标签。
【讨论】:
我没有找到initWithCoder()
的方法,但是在awakeFromNib()
中设置标签就可以了。但为此,我必须在故事板中设置标签并在我的自定义单元类中添加一个 IBOutlet 并将其连接到故事板单元中的标签。谢谢!以上是关于以编程方式将 UILabel 添加到自定义 tableViewCell的主要内容,如果未能解决你的问题,请参考以下文章
将 UILabel 添加到自定义 UICollectionViewCell 不会出现在 cellForItemAtIndexPath 中
以编程方式将 UILabel 添加到 CollectionViewCells