从故事板为每行重新创建UITableViewCell而不出列

时间:2015-03-08 16:03:50

标签: uitableview swift ios8 storyboard

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

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

这里是如何约束细胞的。 Storyboard cell

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

如果您需要创意,请参阅以下代码:

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个单元格,所以性能不应该成为一个问题。

1 个答案:

答案 0 :(得分:0)

删除图像似乎正在删除与之关联的所有约束。

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

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

@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以获得所需的结果,但这是一般的想法。

我希望这会对你有所帮助。