I'm trying to make an app like a "Messaging App". You can send and receive messages (there are text messages and image messages). The problem is that when i send an image it's ok, but when i send another one, both images turns equal to the last one that i sent.
The main controller (where the messages are) is a CollectionViewController, and it has a "ChatMessageCell" class.
I'm put the code bellow. I hope you can help me... thank you!
var messages = [Message]()
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! ChatMessageCell
let message = messages[indexPath.item]
cell.textView.text = message.text
setupCell(cell, message: message)
if let text = message.text {
//a text message
cell.bubbleWidthAnchor?.constant = estimateFrameForText(text).width + 32
cell.textView.isHidden = false
} else if message.text == nil {
//fall in here if its an image message
cell.bubbleWidthAnchor?.constant = 200
cell.textView.isHidden = true
}
return cell
}
fileprivate func setupCell(_ cell: ChatMessageCell, message: Message) {
if message.id == 1 {
//outgoing blue
cell.bubbleViewRightAnchor?.isActive = true
cell.bubbleViewLeftAnchor?.isActive = false
if message.text != nil {
//text message
cell.bubbleView.backgroundColor = ChatMessageCell.blueColor
cell.textView.textColor = UIColor.white
cell.messageImageView.isHidden = true
} else {
//image message
cell.messageImageView.image = imagenSeleccionada
cell.messageImageView.isHidden = false
cell.bubbleView.backgroundColor = UIColor.clear
}
} else if message.id == 2 {
//incoming gray
cell.bubbleViewRightAnchor?.isActive = false
cell.bubbleViewLeftAnchor?.isActive = true
if message.text != nil {
//mensaje de texto
cell.bubbleView.backgroundColor = UIColor(red: 240/255, green: 240/255, blue: 240/255, alpha: 1.0)
cell.textView.textColor = UIColor.black
cell.messageImageView.isHidden = true
} else {
//mensaje de imagen
cell.messageImageView.image = imagenSeleccionada
cell.messageImageView.isHidden = false
cell.bubbleView.backgroundColor = UIColor.clear
}
}
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
var message: Message?
if swiche.isOn == true {
message = Message(text: self.inputTextField.text, id: 1, imagen: nil, imageHeight: nil, imageWidth: nil)
} else {
message = Message(text: self.inputTextField.text, id: 2, imagen: nil, imageHeight: nil, imageWidth: nil)
}
messages.append(message!)
self.inputTextField.text = nil
collectionView?.reloadData()
return true
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
//we selected an image
handleImageSelectedForInfo(info as [String : AnyObject])
dismiss(animated: true, completion: nil)
}
private func handleImageSelectedForInfo(_ info: [String: AnyObject]) {
var selectedImageFromPicker: UIImage?
if let editedImage = info["UIImagePickerControllerEditedImage"] as? UIImage {
selectedImageFromPicker = editedImage
} else if let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage {
selectedImageFromPicker = originalImage
}
if let selectedImage = selectedImageFromPicker {
imagenSeleccionada = selectedImage
}
var message: Message?
if swiche.isOn == true {
//azul
message = Message(text: nil, id: 1, imagen: imagenSeleccionada, imageHeight: imagenSeleccionada?.size.height as NSNumber?, imageWidth: imagenSeleccionada?.size.width as NSNumber?)
} else {
message = Message(text: nil, id: 2, imagen: imagenSeleccionada, imageHeight: imagenSeleccionada?.size.height as NSNumber?, imageWidth: imagenSeleccionada?.size.width as NSNumber?)
}
messages.append(message!)
collectionView?.reloadData()
}
The "Message" class (of type NSObject)
struct Message {
var text: String?
//1 = blue ; 2 = gris
var id: NSNumber?
var imagen: UIImage?
var imageHeight: NSNumber?
var imageWidth: NSNumber?
}
In your setupCell
method, you are setting the imageView to have image stored in variable imagenSeleccionada
. So to solve your problem, use this to replace your setupCell
method
func setupCell(_ cell: ChatMessageCell, message: Message) {
if message.id == 1 {
//outgoing blue
cell.bubbleViewRightAnchor?.isActive = true
cell.bubbleViewLeftAnchor?.isActive = false
if message.text != nil {
//text message
cell.bubbleView.backgroundColor = ChatMessageCell.blueColor
cell.textView.textColor = UIColor.white
cell.messageImageView.isHidden = true
} else {
//image message
cell.messageImageView.image = Message.imagen
cell.messageImageView.isHidden = false
cell.bubbleView.backgroundColor = UIColor.clear
}
} else if message.id == 2 {
//incoming gray
cell.bubbleViewRightAnchor?.isActive = false
cell.bubbleViewLeftAnchor?.isActive = true
if message.text != nil {
//mensaje de texto
cell.bubbleView.backgroundColor = UIColor(red: 240/255, green: 240/255, blue: 240/255, alpha: 1.0)
cell.textView.textColor = UIColor.black
cell.messageImageView.isHidden = true
} else {
//mensaje de imagen
cell.messageImageView.image = Message.imagen
cell.messageImageView.isHidden = false
cell.bubbleView.backgroundColor = UIColor.clear
}
}
}