自定义 UITableViewCell 未正确加载

Posted

技术标签:

【中文标题】自定义 UITableViewCell 未正确加载【英文标题】:Custom UITableViewCell not loading properly 【发布时间】:2016-07-23 13:02:59 【问题描述】:

我有一个自定义 UITableViewCell,它有两个子视图,一个标签和一个 UIView。 UIView 旨在成为将在运行时加载的自定义视图的容器,它在 IB 中设置了红色背景。

自定义单元格具有设置单元格的方法 setupWithData(data: Data)。该方法从 tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) 调用,数据来自 tableView 的数据源。

但是,当 tableView 加载时,只能看到前几个单元格的红色背景(没有自定义视图)。当我向下滚动时,自定义视图开始出现。奇怪的是,所有单元格的标签都有正确的文本。

我使用界面调试器进行了调查,发现自定义视图确实已添加到容器视图中,但其所有约束(宽度、高度、midX、midY)都设置为 0。此外,我还查看了加载的向下滚动后的单元格(实际上已经正确加载了我的自定义视图的单元格)并意识到有时其中的容器视图有时会有我的自定义视图的两个子视图,其中包含不同的数据。

如果能提供任何帮助,我将不胜感激。

注意:我正在使用 Swift 3。

更新

这是我的setup 代码:

func setupWithParticle(_ particle: ParticleProtocol, isFavourite: Bool = false) 
    self.particleLabel.text = particle.name(withColor: false)

    let particleView = ParticleView(position: CGPoint.zero, width: self.particleViewContainer.width, particle: particle)
    particleView.respondsToTouch = false
    particleView.setBorders([.Top, .Left, .Right, .Bottom], width: 1, color: .black())

    if isFavourite 
        particleView.backgroundColor = #colorLiteral(red: 0.9559464455, green: 0.7389599085, blue: 0.2778314948, alpha: 1)
    

    self.particleViewContainer.subviews.forEach 
        $0.removeFromSuperview()
    

    self.particleViewContainer.addSubview(particleView)

【问题讨论】:

请把你的 setupWithData 东西。如果没有代码,我们无法想象你做了什么。 @DharmbirSingh 已更新。 【参考方案1】:

不要在您的tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) 中调用addSubview:

请记住,单元格是可重复使用的。 particleView 将一遍又一遍地添加到您的单元格中。

所以请先尝试从particleViewContainer 删除子视图,然后再将addSubview: 删除

更新

在使用self.parentViewContainer.width之前,请尝试致电self.parentViewContainer.layoutIfNeeded()

【讨论】:

恐怕删除子视图只会有助于容器中存在多个自定义视图。你说不要在tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)中调用addSubview,那我应该在哪里调用呢? 如果您正确删除子视图,您可以在 cellfor 中调用 addSubview:。 我现在这样做(通过setupWithParticle),但我的问题没有解决。在滚动之前,我仍然会看到容器视图的红色背景。 您能否将 setupWithParticle 中的代码更新到您的帖子中? 在setup中打断点,看看self.parentViewContainer.width是否等于0?

以上是关于自定义 UITableViewCell 未正确加载的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UITableViewCell 中的 UIImageview 未正确显示

首次加载 UITableViewController 时自定义 UITableViewCell 无法正确显示

为自定义 UITableViewCell 加载和注册 nib 时未调用 prepareForSegue

从 StoryBoard 加载的自定义 UITableViewCell 未解除分配

为啥我的自定义 UITableViewCell 宽度在初始加载时不正确?

自定义 UITableViewCell 未出现在表格中