从情节提要中为每一行重新创建 UITableViewCell 而无需出列

Recreate UITableViewCell from storyboard for each row without dequeuing

这是我要解决的一个有趣的问题。

我想通过从单元格中删除我不需要的东西来使用故事板中针对不同单元格配置配置的单个单元格。

这里是如何约束单元格的。

基本上,如果我不需要步骤(或红色视图)的图像,我只需将其从单元格中删除,一切都动态对齐非常完美,而且我不必计算单元格高度或进行任何编码.但是,由于我必须重复使用这些单元格,所以当我获取下一行的单元格时,我没有那个视图。我可以再次将它添加到单元格中,但我失去了所有约束。

如果您需要它作为灵感,这里有一些代码:

class RecipeStepTableViewCell: UITableViewCell {

  @IBOutlet weak var preparationLabel: UILabel!
  @IBOutlet weak var stepNumberLabel: UILabel!
  @IBOutlet weak var stepImageView: UIImageView!
  @IBOutlet weak var stepTextLabel: UILabel!
  @IBOutlet weak var stepTimerView: UIView!

  override func awakeFromNib() {
    super.awakeFromNib()
  }
}

我就是这样处理的cellForRowAtIndexPath:

let cell = tableView.dequeueReusableCellWithIdentifier("RecipeStepCell", forIndexPath: indexPath) as RecipeStepTableViewCell
let step = stepForIndexPath(indexPath)

if step.image == nil {
    cell.stepImageView.removeFromSuperview()
}
// etc.

我真的很喜欢这种方法,因为我不必构建 10 个单元格配置,我需要的只是强制它为每一行创建一个新单元格。

顺便说一下,视图将只有 5、6 个单元格,因此性能应该不是问题。

似乎删除图像就是删除与其关联的所有约束。

我有个主意。您可以在 step.image == nil 时调整约束,而不是删除图像,因为无论如何图像都是不可见的。

这将通过使用故事板将 IBOutlets 连接到约束来完成。它看起来像这样:

@IBOutlet weak var constraintToTop: NSLayoutConstraint!

然后再调整一下,

let cell = tableView.dequeueReusableCellWithIdentifier("RecipeStepCell", forIndexPath: indexPath) as RecipeStepTableViewCell
let step = stepForIndexPath(indexPath)

if step.image == nil { //Set constraint(s) so imageView takes up no space
    cell.constraintToTop.constant = 0
}
else { //Go back to original constraints
    cell.constraintToTop.constant = 50
}

这可能需要为您的约束创建许多 IBOutlet 才能获得所需的结果,但这是一般的想法。

希望对您有所帮助。