Ios UITableViewCells在X单元格之后停止正确显示

Ios UITableViewCells在X单元格之后停止正确显示,ios,swift,uitableview,Ios,Swift,Uitableview,Swift 4+Xcode 9 我已经研究这个问题好几个星期了,试图自己解决它。我将感谢任何人能提供的任何帮助。我没有在我的初始问题中发布任何代码,因为它是专有的。如果需要帮助解决我的问题,我很乐意提供其中的一部分 我有一个带有自定义单元格的UITableView,其中包含非常复杂的子视图布局,其中一些子视图是隐藏或显示的(使用1000优先级高度=0约束,这些约束在cellForRowAt期间添加和删除),具体取决于数据。还有一个ImageView,它应该始终是全宽的,并且应该更改高度以匹配通过

Swift 4+Xcode 9

我已经研究这个问题好几个星期了,试图自己解决它。我将感谢任何人能提供的任何帮助。我没有在我的初始问题中发布任何代码,因为它是专有的。如果需要帮助解决我的问题,我很乐意提供其中的一部分

我有一个带有自定义单元格的
UITableView
,其中包含非常复杂的子视图布局,其中一些子视图是隐藏或显示的(使用
1000优先级
高度=0
约束,这些约束在
cellForRowAt
期间添加和删除),具体取决于数据。还有一个
ImageView
,它应该始终是全宽的,并且应该更改高度以匹配通过
Kingfisher.shared.retrieveImage()加载的图像。获得图像后,我将更新该单元格图像上的
aspectRatio
约束,并显示单元格。这对前15-20个单元格非常有效,但当我滚动更多行时,它就会停止工作。图像很小,居中,某些数据字段没有更新,等等。如果我继续滚动,有时一个单元格会在这里和那里正常运行,但几乎所有单元格都不会

现在来看有趣的部分:如果我向后滚动,每个单元格都会自动重新格式化,使其看起来像它应该的样子,然后,每个单元格都是完美的。代码显然是有效的——我觉得这可能是平台中的一个bug,但在我假设之前,我想看看是否有其他人遇到过类似的问题

再次,非常感谢您提供的任何帮助-我非常渴望解决这个问题

更新:为了回答几个问题,这里有一段代码,它是自定义单元格类的一部分。这就是我如何设置单元格图像(包括更新纵横比约束)以及如何重置单元格以便重复使用。

internal var aspectConstraint : NSLayoutConstraint? {
    didSet {
        if oldValue != nil {
            imageView.removeConstraint(oldValue!)
        }
        if aspectConstraint != nil {
            imageView.addConstraint(aspectConstraint!)
        }
    }
}

override func prepareForReuse() {
    super.prepareForReuse()
    aspectConstraint = nil
    imageView.image = nil
    for view in subviews {
        for c in view.constraints {
            if c.firstAttribute == NSLayoutAttribute.height && c.constant == 0 {
                view.removeConstraint(c)
            }
        }
    }
}

func setCustomImage(image : UIImage) {
    let aspect = image.size.width / image.size.height
    let constraint = NSLayoutConstraint(item: imageView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: imageView, attribute: NSLayoutAttribute.height, multiplier: aspect, constant: 0.0)
    constraint.priority = UILayoutPriority(999)
    aspectConstraint = constraint
    imageView.image = image
}

对于任何人来说,由于在这个问题上完全缺乏解决方案,我认为UIKit不适合我的目的。我使用了(以前是AsyncDisplayKit),我的进度已经恢复。

你能分享一下pic@joelIt吗?听起来你可能因为单元重用而有额外的限制。在重复使用单元时,如何确保删除已添加的任何约束?你是如何更新纵横比约束的?再加上@vacawama所说的:这听起来很像是单元重用的问题。罪魁祸首可能在您的
prepareforeuse
方法中。这应该将重用的每个单元格重置为原始状态。如果您有可变高度的单元格,则必须执行的另一件事是实现
heightForRowAt:
和/或
estimatedHeightForRowAt:
否则tableview将无法正确计算scrollview偏移,您将得到所描述的问题。我已经为问题添加了信息,希望能够回答这些问题。