iOS Cell重用更改颜色

时间:2016-07-06 10:51:58

标签: ios swift

我知道这是一个常见的问题,我研究过但我找不到问题。

我的代码:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let row = indexPath.row
     let cell1=tableView.dequeueReusableCellWithIdentifier(textCellIdentifier) as! MessageCell
     cell1.setCell(swiftBlogs[row])
     return cell1

}

MessageCell.swift

func setCell(message:Message) {
    messageLabel.text = message.text
    if message.incoming != (tag == incomingTag) {
        var layoutAttribute: NSLayoutAttribute
        var layoutConstant: CGFloat

        if message.incoming {
            tag = incomingTag
            bubbleImageView.image = bubbleImage.incoming
            bubbleImageView.highlightedImage = bubbleImage.incomingHighlighed
            messageLabel.textColor = UIColor.blackColor()
            layoutAttribute = .Left
            layoutConstant = 10
        } else { // outgoing
            tag = outgoingTag

            if message.isSent == 1 {
                bubbleImageView.image = bubbleImage.outgoing
            }
            if message.isSent == 0 {
                bubbleImageView.image = bubbleImage.notYetSent
            }
            bubbleImageView.highlightedImage = bubbleImage.outgoingHighlighed
            messageLabel.textColor = UIColor.whiteColor()
            layoutAttribute = .Right
            layoutConstant = -10
        }



        let constraints: NSArray = contentView.constraints
        let indexOfConstraint = constraints.indexOfObjectPassingTest { (constraint, idx, stop) in
            return (constraint.firstItem as! UIView).tag == bubbleTag && (constraint.firstAttribute == NSLayoutAttribute.Left || constraint.firstAttribute == NSLayoutAttribute.Right)
        }
        contentView.removeConstraint(constraints[indexOfConstraint] as! NSLayoutConstraint)
        contentView.addConstraint(NSLayoutConstraint(item: bubbleImageView, attribute: layoutAttribute, relatedBy: .Equal, toItem: contentView, attribute: layoutAttribute, multiplier: 1, constant: layoutConstant))
    }

}

让我解释一下我的代码:正如您在setCell中看到的那样message.incoming如果为真,则单元格应位于左侧。如果为false,则单元格应位于右侧。 这没有任何问题。但是正如你所看到的,我还有一个if语句。如果message.isSent == 1,那么我正在更改image的{​​{1}}属性,我的问题从此处开始。 bubbleImageView为蓝色图片,bubbleImage.outgoing为红色图片。当我开始滚动单元格颜色正在改变时,即使bubbleImage.notYetSent值也没有改变。

我对第一个if语句(isSent检查没有问题。)每个事情看起来都很棒,但颜色正在发生变化。我该如何解决这个问题?

示例:

滚动前:

enter image description here

滚动后:

enter image description here

1 个答案:

答案 0 :(得分:1)

我对你如何使用tag有点不清楚,但这一行:

if message.incoming != (tag == incomingTag) {

会阻止您访问此代码:

        if message.isSent == 1 {
            bubbleImageView.image = bubbleImage.outgoing
        }
        if message.isSent == 0 {
            bubbleImageView.image = bubbleImage.notYetSent
        }

在细胞重用的情况下。每次设置单元格时,此代码都需要运行,并且该单元格是传出消息。考虑将设置的那部分移到第一个条件之外:

if message.incoming != (tag == incomingTag) {
    // setup code

}

if !message.incoming {
    if message.isSent == 1 {
        bubbleImageView.image = bubbleImage.outgoing
    }
    if message.isSent == 0 {
        bubbleImageView.image = bubbleImage.notYetSent
    }
}