Search code examples
swiftimagechatmessage

Trouble with images messages in my "Messaging App"


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?

}


Solution

  • 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
            }
    
        }
    
    }