Я создаю приложение чата, в котором я создаю речевые пузыри. Проблема возникает с ячейкой, поскольку она перекрывается при прокрутке UITableView. Я пробовал много решений, но все они не работали.
Мой код ниже:
var cell:chatBubble? = tableView.dequeueReusableCell(withIdentifier:"cell1") as? chatBubble
if cell == nil {
tableView.register(UINib.init(nibName: "chatBubble", bundle: nil), forCellReuseIdentifier: "cell1")
let arrNib:Array = Bundle.main.loadNibNamed("chatBubble",owner: self, options: nil)!
cell = arrNib.first as? chatBubble
}
let green = UIColor(red: 179/255, green: 52/255, blue: 199/255, alpha: 1)
if (arrCell.contains(indexPath.row)) {
print("Exist")
} else {
arrCell.append(indexPath.row)
print("Not exist")
cell!.showOutgoingMessage(color: green, text: self.animals[indexPath.row], tag: indexPath.row)
}
UITableviewCell
func showOutgoingMessage(color: UIColor, text: String, tag: Int) {
lblmsg.numberOfLines = 0
lblmsg.font = UIFont.systemFont(ofSize: 18)
lblmsg.textColor = .white
lblmsg.text = text
lblmsg.tag = tag
let constraintRect = CGSize(width: 0.66 * self.frame.width,
height: .greatestFiniteMagnitude)
let boundingBox = text.boundingRect(with: constraintRect,
options: .usesLineFragmentOrigin,
attributes: [.font: lblmsg.font],
context: nil)
lblmsg.frame.size = CGSize(width: ceil(boundingBox.width),
height: ceil(boundingBox.height))
let bubbleImageSize = CGSize(width: lblmsg.frame.width + 20,
height: lblmsg.frame.height + 20)
outgoingMessageView = UIImageView(frame:
CGRect(x: self.lblmsg.frame.origin.x,
y: self.lblmsg.frame.origin.y,
width: bubbleImageSize.width,
height: bubbleImageSize.height))
outgoingMessageView.tag = tag
let bubbleImage = UIImage(named: "incoming-message-bubble")?
.resizableImage(withCapInsets: UIEdgeInsets(top: 17, left: 21, bottom: 17, right: 21),
resizingMode: .stretch)
.withRenderingMode(UIImageRenderingMode.alwaysTemplate)
outgoingMessageView.image = bubbleImage
outgoingMessageView.tintColor = color
self.addSubview(outgoingMessageView)
}
Я использовал следующую функцию для решения повторяющихся ячеек, но она очищает как 1-я, так и 8-я ячейка (повторно используемая ячейка). я просто хочу очистить вещи в повторяющейся ячейке.
override func prepareForReuse() {
super.prepareForReuse()
self.lblmsg.text = nil
self.outgoingMessageView.image = nil
}
[![cell repeat][1]][1]
[1]: https://i.stack.imgur.com/FRAi4.png
Не уверен, что это полностью решит вашу проблему, но после просмотра вашего кода у меня есть пара предложений.
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UINib.init(nibName: "chatBubble", bundle: nil), forCellReuseIdentifier: "cell1")
}
var cell:chatBubble? = tableView.dequeueReusableCell(withIdentifier:"cell1") as? chatBubble
if cell == nil {
tableView.register(UINib.init(nibName: "chatBubble", bundle: nil), forCellReuseIdentifier: "cell1")
let arrNib:Array = Bundle.main.loadNibNamed("chatBubble",owner: self, options: nil)!
cell = arrNib.first as? chatBubble
}
к
let cell = tableView.dequeueReusableCell(withIdentifier: "cell1", for: indexPath) as! chatBubble
outgoingMessageView = UIImageView(frame:
CGRect(x: self.lblmsg.frame.origin.x,
y: self.lblmsg.frame.origin.y,
width: bubbleImageSize.width,
height: bubbleImageSize.height))
вместо этого обновить кадр
outgoingMessageView.frame = CGRect(x: self.lblmsg.frame.origin.x,
y: self.lblmsg.frame.origin.y,
width: bubbleImageSize.width,
height: bubbleImageSize.height)
self.addSubview(outgoingMessageView)
или добавьте это outgoingMessageView только один раз в override func awakeFromNib()
или в override func prepareForReuse()
или около того
Я добавил исходящий просмотр изображений как ioutlet, изменил часть кода, которая создает проблему с дублированием ячеек. Также я применил ваши предложения. Спасибо, Андрей.
На самом деле следующий фрагмент кода приводит к дублированию ячеек.
if (arrCell.contains(indexPath.row)) {
print("Exist")
} else {
arrCell.append(indexPath.row)
print("Not exist")
cell!.showOutgoingMessage(color: green, text: self.animals[indexPath.row], tag: indexPath.row)
}
Я удалил этот фрагмент кода, и дублирование ячеек исчезло.
Вы не предоставили достаточно информации, чтобы люди могли помочь с проблемой, которую вы описываете. Есть также как минимум 5 проблем (подробно описанных в ответе ниже), которые необходимо решить здесь, прежде чем эта дополнительная информация может быть полезной, и даже тогда, вероятно, будет еще 5-10 проблем.