我知道这是一个常见的问题,我研究过但我找不到问题。
我的代码:
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
检查没有问题。)每个事情看起来都很棒,但颜色正在发生变化。我该如何解决这个问题?
示例:
滚动前:
滚动后:
答案 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
}
}