我的 "Messaging App" 中的图片消息有问题

Trouble with images messages in my "Messaging App"

我正在尝试制作一个类似于 "Messaging App" 的应用程序。您可以发送和接收消息(有文本消息和图像消息)。问题是当我发送一张图片时没问题,但是当我发送另一张图片时,两张图片都变成了我发送的最后一张图片。

主控制器(消息所在的位置)是一个 CollectionViewController,它有一个 "ChatMessageCell" class。

我把代码放在下面。我希望你能帮助我...谢谢!

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()

}

"Message"class(NSObject 类型)

struct Message {

var text: String?

//1 = blue ; 2 = gris
var id: NSNumber?
var imagen: UIImage?

var imageHeight: NSNumber?
var imageWidth: NSNumber?

}

在您的 setupCell 方法中,您将 imageView 设置为将图像存储在变量 imagenSeleccionada 中。所以要解决你的问题,用这个来代替你的setupCell方法

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
        }

    }

}