如何在 UITableViewCell 上使用自定义初始化程序?

Posted

技术标签:

【中文标题】如何在 UITableViewCell 上使用自定义初始化程序?【英文标题】:How can I use a custom initializer on a UITableViewCell? 【发布时间】:2017-12-16 02:33:20 【问题描述】:

我有一个自定义 UITableViewCell,我想在我的表格视图中使用它。这是我的单元格代码:

class ReflectionCell: UITableViewCell 

@IBOutlet weak var header: UILabel!
@IBOutlet weak var content: UILabel!
@IBOutlet weak var author: UILabel!

override func awakeFromNib() 
    super.awakeFromNib()


init(data: Reflection) 
    self.header.text = data.title
    self.content.text = data.content
    self.author.text = data.author.name
    super.init(style: UITableViewCellStyle.default, reuseIdentifier: "reflectionCell")


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


我有一个模型类Reflection,我想用它来初始化单元格。但是,在我的视图控制器中,我需要使用tableView.dequeueReusableCell(withIdentifier: "reflectionCell", for: indexPath)。有什么方法可以让我使用我制作的自定义初始化程序吗?

【问题讨论】:

TableViewCell 被重用,你不要那样做。您可以做的是创建一个方法updateWith(data:Reflection) 并设置标签值,或者创建一个属性var data:Reflection 并在didSet 上设置标签的值。 【参考方案1】:

如果您使用dequeueReusableCell,则无法更改调用的初始化方法。但是您可以编写自己的方法来更新 IBOutlets,然后在成功使单元格出列后调用该方法。

class ReflectionCell: UITableViewCell 

    @IBOutlet weak var header: UILabel!
    @IBOutlet weak var content: UILabel!
    @IBOutlet weak var author: UILabel!

    func update(for reflection: Reflection) 
        header.text = reflection.title
        content.text = reflection.content
        author.text = reflection.author.name
    


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "identifier", for: indexPath) as! ReflectionCell
    cell.update(for: reflections[indexPath.row])
    return cell

【讨论】:

重点是初始化单元格,而不是更新它。该方案必须让您在实例化时第一次添加视图。接受的答案可以替换为存储变量的 didSet 闭包。 dequeueReusableCell 的全部意义在于明确为每一行初始化一个新单元格,而是在可能的情况下查看是否存在以前使用过的单元格现在可以重复使用,只需更新它。

以上是关于如何在 UITableViewCell 上使用自定义初始化程序?的主要内容,如果未能解决你的问题,请参考以下文章

UIImage 中的自定尺寸 UITableViewCell 拉伸

虽然我在情节提要上增加 UITableViewCell 高度,但在设备或模拟器上看不到

如何在 UITableView 单元格中创建自定尺寸网格?

如何在表格视图单元格中快速自定义和实现滑块

单向(仅高度)自定尺寸 UI 组件预览

如何在 UITableViewCell 上使用自定义初始化程序?